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