Что такое принцип подстановки Лисков (LSP) на примере прямоугольника и квадрата?
Принципы S.O.L.I.D
Принцип подстановки Лисков: объекты подтипа должны заменять объекты базового типа без нарушения корректности программы — наследник не вправе ослаблять контракт.
Классический пример
Пусть Square наследует Rectangle, у которого ширину и высоту меняют независимо. Код вида:
rect.setWidth(5);
rect.setHeight(10);
console.assert(rect.area() === 50);ломается на квадрате: изменение одной стороны тянет другую. Наследование корректно математически, но не по поведению. Решение — не наследовать, а выделить общий read-only интерфейс Shape.
Правила контракта
- Предусловия нельзя усиливать, постусловия — ослаблять.
- Инварианты базового типа сохраняются.
- Нельзя бросать новые типы ошибок или «заглушать» методы исключением «не поддерживается».
- Касается любого полиморфизма, включая утиную типизацию, а не только наследования.
Признаки нарушения
Проверки конкретного типа перед вызовом метода и пустые переопределённые методы.
Коротко для собеседования
LSP — наследник должен вести себя так, как ожидает код, написанный под базовый тип. Квадрат, унаследованный от прямоугольника, ломает независимую смену сторон, поэтому их не связывают наследованием; признак нарушения — проверки типа перед вызовом и методы-заглушки.