Sobes.tech
Back to questions
Junior — Middle
80

Можете привести пример, демонстрирующий принцип подстановки Лисков в объектно-ориентированном программировании?

Answer from AI

sobes.tech 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, так как не умеет летать
}

Так объекты подклассов можно использовать без неожиданного поведения.