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.