Что такое принцип подстановки Барбары Лисков (LSP) в ООП?

«Что такое принцип подстановки Барбары Лисков (LSP) в ООП?» — вопрос из категории ООП, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Принцип подстановки Барбары Лисков (LSP) — это один из пяти принципов SOLID. Он гласит, что объекты базового класса должны быть заменяемы объектами его подклассов без нарушения корректности программы. Подкласс должен расширять, а не изменять или сужать поведение родительского класса.

Почему это важно? Нарушение LSP приводит к хрупкому коду, где замена типа вызывает неожиданные ошибки, и ломает полиморфизм.

Пример нарушения LSP:

// Базовый класс
class Rectangle {
    protected int width;
    protected int height;

    public void setWidth(int w) { this.width = w; }
    public void setHeight(int h) { this.height = h; }
    public int getArea() { return width * height; }
}

// Подкласс, нарушающий LSP
class Square extends Rectangle {
    @Override
    public void setWidth(int w) {
        super.setWidth(w);
        super.setHeight(w); // Побочный эффект: меняет высоту
    }

    @Override
    public void setHeight(int h) {
        super.setHeight(h);
        super.setWidth(h); // Побочный эффект: меняет ширину
    }
}

// Клиентский код, который сломается
public void resizeRectangle(Rectangle r) {
    r.setWidth(5);
    r.setHeight(4);
    assert r.getArea() == 20; // Утверждение провалится для Square
}

Решение: Не наследовать Square от Rectangle. Вместо этого использовать композицию, общий интерфейс или признак (flag), если квадрат — частный случай прямоугольника.