Ответ
Принцип подстановки Барбары Лисков (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), если квадрат — частный случай прямоугольника.