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