advanced

Liskov Substitution Principle

Следите, чтобы implementations соблюдали тот же contract, preconditions, postconditions и error expectations, что и abstraction, которую они заменяют.

LSP: подтипы подставляемы вместо базового типа без поломки вызывающих — preconditions, postconditions, инварианты и ошибки. Если есть `Bird.fly()`, `Penguin` не должен неожиданно падать как `Bird`.

Design by contract: вызывающий доверяет абстракции; нарушения — тонкие баги в полиморфном коде.

На интервью: rectangle/square и как композиция чинит модель.

Типовые ошибки: усиление preconditions в override; ослабление postconditions; несовместимые возвращаемые типы; пустые override.

Компромисс — строгая дисциплина subtyping против соблазна наследования только ради reuse.

Чеклист:

  • Подтипы не удивляют callers.
  • Композиция, когда is-a ложно.
  • Contract tests на substitutability.