Ответ вслух Senior ООП и класс Object обновлено

Композиция или наследование

Вопрос

Когда вы используете наследование, а когда композицию? Приведите пример из практики.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

По умолчанию я выбираю композицию: класс держит зависимость в поле и делегирует ей, а снаружи показывает только нужный API. Так проще подменить реализацию и замокать в тесте.

Что должно прозвучать в ответе

  • Наследование: отношение «является» и стабильный базовый класс

  • Проблема хрупкого базового класса

  • Наследник получает весь публичный API родителя

  • Композиция: поле плюс делегирование, проще подменить и тестировать

  • Интерфейсы плюс композиция как дефолт

  • Пример: Stack extends Vector или декоратор вместо наследования

Что могут спросить следом

  • Что такое принцип подстановки Лисков?
  • Как sealed-классы меняют это решение?

Разбор

По умолчанию я выбираю композицию: класс держит зависимость в поле и делегирует ей, а снаружи показывает только нужный API. Так проще подменить реализацию и замокать в тесте. Наследование беру, когда отношение действительно «является», базовый класс спроектирован для расширения, и наследник соблюдает принцип Лисков, то есть может стоять везде, где ожидается родитель. Минусы наследования: хрупкий базовый класс (изменение родителя ломает детей) и утечка API, классический пример Stack extends Vector, у которого есть add(index, e). В Java 17+ sealed-иерархии позволяют закрыть набор наследников, это удобно для моделей данных вместе с pattern matching.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.