Композиция и наследование - два основных механизма повторного использования кода в ООП, но они представляют разные типы отношений между классами:
is-a отношение): Отношение "является". Подкласс расширяет или специализирует поведение суперкласса. Дочерний класс наследует поля и методы родительского класса.has-a отношение): Отношение "имеет". Класс содержит экземпляры других классов как своих членов. Делегирует часть своего поведения этим содержащимся объектам.Основные отличия:
| Признак | Наследование | Композиция |
|---|---|---|
| Отношение | is-a (является) | has-a (имеет) |
| Гибкость | Менее гибкое (фиксированная иерархия) | Более гибкое (можно менять компоненты) |
| Связь | Сильная связь между классами | Слабая связь между классами |
| Полиморфизм | Достигается через переопределение | Достигается через делегирование |
| Изменения | Изменения в родительском классе могут сломать дочерние | Изменения в содержащем классе меньше влияют на другие |
| Сложность | Может привести к "проблеме хрупкого базового класса" | Более простая организация кода |
Пример наследования:
java
Пример композиции:
java
В целом, композиция предпочтительнее наследования во многих случаях, поскольку она обеспечивает большую гибкость и уменьшает связанность между классами. Наследование следует использовать, когда существует четко определенное отношение "является", и подкласс действительно расширяет функциональность базового класса.