В объектно-ориентированных языках программирования существует три способа организации взаимодействия между классами (наследование, композиция, агрегация).
(1) Наследование — это когда класс-наследник имеет все поля и методы родительского класса, и, как правило, добавляет какой-то новый функционал или/и поля. Наследование описывается словом «является» (IS-A). Легковой автомобиль является автомобилем. Вполне естественно, если он будет его наследником.
Ассоциация – это когда один класс включает в себя другой класс в качестве одного из полей. Ассоциация описывается словом «имеет» (HAS-A). Автомобиль имеет двигатель. Вполне естественно, что он не будет являться наследником двигателя. (Ассоциация по сути говорит о взаимоотношении с объектом).
Выделяют два частных случая ассоциации: композицию и агрегацию.
(2) Композиция – (или её ещё называют «сильная ассоциация») это когда двигатель не существует отдельно от автомобиля. Он создается при создании автомобиля и полностью управляется автомобилем
(3) Агрегация – (или её ещё называют «слабая ассоциация») это когда экземпляр двигателя создается где-то в другом месте кода, и передается в конструктор автомобиля в качестве параметра.
Разработчик выбирает тот или иной путь основываясь на элементарной логике (является или имеет), но также принимает во внимание возможности и ограничения, которые дают и накладывают эти способы.
Если логика задана так, что дочерней структуре необходимо существовать вне зависимости от родительской, значит нужно использовать агрегацию. Если нет – композицию.
Примеры
- Агрегация подразумевает такой тип отношений, в которых дочерняя структура может существовать независимо от родительской. Пример:
Person
(родительский класс) иStudent
(дочерний класс). ЕслиPerson
будет удалён,Student
всё равно продолжит существовать. - Композиция подразумевает такой тип отношений, в которых дочерняя структура не может существовать отдельно от родительской. Пример:
House
(родительский класс) иRoom
(дочерний класс).Room
не существует отдельно отHouse
.