Композиция и агрегирование
Классы и объекты могут быть связаны друг с другом. Наследование описывает связь «является» (или по-английски «IS A»). Лев является Животным. Такое отношение легко выразить с помощью наследования, где
Animal
будет родительским классом, а
Lion
— потомком.
Однако не все связи отношения в мире описываются таким образом. К примеру, клавиатура определенно как-то связана с компьютером, но
она не является компьютером. Руки как-то связаны с человеком, но они не являются человеком.
В этих случаях в его основе лежит другой тип отношения: не «является», а «является частью» («HAS A»). Рука не является человеком, но является частью человека. Клавиатура не является компьютером, но является частью компьютера.
Отношения HAS A можно описать в коде, используя механизмы
композиции и
агрегирования. Разница между ними заключается в «строгости» этих связей.
Приведем простой пример:
У нас есть наш
Car
— машина.
У каждой машины есть двигатель.
Кроме того, у каждой машины есть пассажиры внутри.
В чем же принципиальная разница между полями
Engine engine
и
Passenger [] passengers
? Если у машины внутри сидит пассажир
А
, это не значит, что в ней не могут находиться пассажиры
B
и
C
.
Одна машина может соответствовать нескольким пассажирам. Кроме того, если всех пассажиров высадить из машины, она продолжит спокойно функционировать.
Связь между классом
Car
и массивом пассажиров
Passenger [] passengers
менее строгая. Она называется
агрегацией.
Есть неплохая статья на эту тему:
Отношения между классами (объектами).
В ней приведен еще один хороший пример агрегации. Допустим, у нас есть класс
Student
, обозначающий студента, и класс
StudentsGroup
(группа студентов). Студент может входить и в клуб любителей физики, и в студенческий фан-клуб «Звездных войн» или команду КВН.
Композиция — более строгий тип связи. При использовании композиции объект не только является частью какого-то объекта, но и не может принадлежать другому объекту того же типа.
Самый простой пример — двигатель автомобиля. Двигатель является частью автомобиля, но не может быть частью другого автомобиля.
Как видишь, их связь гораздо более строгая, чем у
Car
и
Passengers
.
![Отношения между классами. Наследование, композиция и агрегирование - 4]()
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ