Sobes.tech
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í.