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.