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.