Что предпочтительнее: наследование или композиция? Поясните, в чем разница между ними.
Уровень: Senior
Ответ
Наследование и композиция – два разных подхода к организации кода. Наследование подразумевает отношение "является" (is-a): класс-наследник расширяет базовый класс, унаследуя его свойства/методы, и может переопределить или добавить новое поведение. Композиция означает, что один объект содержит в себе другой объект для использования его функциональности – отношение "имеет" (has-a). Вместо того, чтобы наследовать класс, мы включаем его как поле и вызываем его методы по мере необходимости. Вместо наследования часто предпочтительнее композиция, поскольку она обеспечивает более слабую связанность: изменения во включаемом классе не влияют на внешний интерфейс композитного класса, и мы можем более гибко менять компоненты. Наследование же связывает классы сильнее (наследник зависит от реализации родителя, может столкнуться с проблемами хрупкой иерархии). Правило "предпочитай композицию наследованию" означает: используйте наследование только когда отношение действительно логически является "is-a" и требуется полиморфизм, в остальных случаях лучше включить необходимые объекты. Композиция облегчает замену частей системы (можно подменить компонент другим классом, реализующим нужный интерфейс) и тестирование (можно замокать компоненты), а наследование часто ведёт к более жёсткой структуре и потенциальному дублированию кода, если иерархия выстраивается неправильно.