Junior — Middle
Můžete uvést příklad ilustrující princip Liskovovy substituce v objektově orientovaném programování?
sobes.tech AI
Odpověď od AI
Princip Liskovovy substituce (Liskov Substitution Principle, LSP) říká, že objekty podtřídy by měly být zaměnitelné s objekty nadtřídy bez narušení správnosti programu.
Příklad:
// Nadtřída
class Bird {
void fly() {
System.out.println("Pták létá");
}
}
// Podtřída, která správně rozšiřuje chování
class Sparrow extends Bird {
@Override
void fly() {
System.out.println("Vrabc létá");
}
}
// Porušení LSP
class Ostrich extends Bird {
@Override
void fly() {
throw new UnsupportedOperationException("Pštros neumí létat");
}
}
// Použití
void makeBirdFly(Bird bird) {
bird.fly(); // Očekává se, že pták bude létat
}
// Pokud předáme Ostrich, metoda fly() vyhodí výjimku, což porušuje LSP.
Pro dodržení LSP je lepší hierarchii rozdělit:
interface Flyable {
void fly();
}
class Bird {}
class Sparrow extends Bird implements Flyable {
public void fly() { System.out.println("Vrabc létá"); }
}
class Ostrich extends Bird {
// Nepřiděluje Flyable, protože neumí létat
}
Tímto způsobem lze objekty podtříd používat bez neočekávaného chování.