intermediate
Inheritance и polymorphism
Используйте inheritance для настоящих subtype relationships и polymorphism, чтобы вызывать behavior через shared contract без branching по concrete types.
Наследование моделирует is-a: `Square extends Rectangle` только если подтип честно соблюдает контракт родителя (LSP). Полиморфизм позволяет вызывать через общий интерфейс — `Notifier` — без ветвления по классам; runtime dispatch вызывает нужный `send`.
Предпочитайте мелкие иерархии: глубокие деревья связывают несвязанные изменения и сюрпризы override.
На интервью: корректный пример полиморфизма и классическое нарушение LSP (square-rectangle).
Типовые ошибки: наследование только ради reuse; override, ломающий ожидания родителя; цепочки `instanceof` вместо полиморфных вызовов.
Компромисс — краткое общее поведение против хрупких иерархий — часто выигрывает композиция.
Чеклист:
- Наследование для настоящего subtyping.
- Вызовы через абстракции.
- Проверка substitutability перед extend.