Sobes.tech
Junior — Middle

Czy możesz podać przykład ilustrujący zasadę podstawiania Liskov w programowaniu obiektowym?

sobes.tech AI

Odpowiedź od AI

Zasada podstawiania Liskova (Liskov Substitution Principle, LSP) mówi, że obiekty podklasy powinny być wymienialne z obiektami nadklasy bez naruszania poprawności programu.

Przykład:

// Nadklasa
class Bird {
    void fly() {
        System.out.println("Ptak lata");
    }
}

// Podklasa poprawnie rozszerzająca zachowanie
class Sparrow extends Bird {
    @Override
    void fly() {
        System.out.println("Wróbel lata");
    }
}

// Naruszenie LSP
class Ostrich extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException("Struś nie potrafi latać");
    }
}

// Użycie
void makeBirdFly(Bird bird) {
    bird.fly(); // Oczekuje się, że ptak potrafi latać
}

// Jeśli przekażemy Ostrich, metoda fly() wyrzuci wyjątek, naruszając LSP.

Aby przestrzegać LSP, lepiej podzielić hierarchię:

interface Flyable {
    void fly();
}

class Bird {}

class Sparrow extends Bird implements Flyable {
    public void fly() { System.out.println("Wróbel lata"); }
}

class Ostrich extends Bird {
    // Nie implementuje Flyable, ponieważ nie potrafi latać
}

W ten sposób obiekty podklas mogą być używane bez nieoczekiwanego zachowania.