Sobes.tech
Junior — Middle

Можете ли да дадете пример, който демонстрира принципа на Лисков за заместимост в обектно-ориентираното програмиране?

sobes.tech AI

Отговор от AI

Принципът на подмяна на Лисков (Liskov Substitution Principle, LSP) гласи, че обектите на подклас трябва да могат да бъдат използвани вместо обектите на суперклас без нарушаване на коректността на програмата.

Пример:

// Суперклас
class Bird {
    void fly() {
        System.out.println("Птицата лети");
    }
}

// Подклас, който правилно разширява поведението
class Sparrow extends Bird {
    @Override
    void fly() {
        System.out.println("Врабчето лети");
    }
}

// Нарушение на LSP
class Ostrich extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException("Щраусът не може да лети");
    }
}

// Използване
void makeBirdFly(Bird bird) {
    bird.fly(); // Очаква се, че птицата може да лети
}

// Ако се подаде Ostrich, методът fly() ще хвърли изключение, нарушавайки LSP.

За да се спази LSP, е по-добре да се раздели йерархията:

interface Flyable {
    void fly();
}

class Bird {}

class Sparrow extends Bird implements Flyable {
    public void fly() { System.out.println("Врабчето лети"); }
}

class Ostrich extends Bird {
    // Не реализира Flyable, тъй като не може да лети
}

По този начин обектите на подкласовете могат да се използват без неочаквано поведение.