PassFront
  1. PassFront
  2. База знаний
  3. Принципы S.O.L.I.D

Что такое принцип подстановки Лисков (LSP) на примере прямоугольника и квадрата?

Принципы S.O.L.I.D

Принцип подстановки Лисков: объекты подтипа должны заменять объекты базового типа без нарушения корректности программы — наследник не вправе ослаблять контракт.

Классический пример

Пусть Square наследует Rectangle, у которого ширину и высоту меняют независимо. Код вида:

rect.setWidth(5);
rect.setHeight(10);
console.assert(rect.area() === 50);

ломается на квадрате: изменение одной стороны тянет другую. Наследование корректно математически, но не по поведению. Решение — не наследовать, а выделить общий read-only интерфейс Shape.

Правила контракта

  • Предусловия нельзя усиливать, постусловия — ослаблять.
  • Инварианты базового типа сохраняются.
  • Нельзя бросать новые типы ошибок или «заглушать» методы исключением «не поддерживается».
  • Касается любого полиморфизма, включая утиную типизацию, а не только наследования.

Признаки нарушения

Проверки конкретного типа перед вызовом метода и пустые переопределённые методы.

Коротко для собеседования

LSP — наследник должен вести себя так, как ожидает код, написанный под базовый тип. Квадрат, унаследованный от прямоугольника, ломает независимую смену сторон, поэтому их не связывают наследованием; признак нарушения — проверки типа перед вызовом и методы-заглушки.

Другие вопросы раздела