Композиція та агрегація (агрегування)

Класи та об'єкти можуть бути пов'язані один з одним. Успадкування описує зв'язок «є» (або англійською «IS A»). Лев є твариною. Таке відношення легко висловити за допомогою успадкування, де Animal буде батьківським класом, а Lion — нащадком.

Однак не всі зв'язки в світі описуються таким чином. Наприклад, клавіатура безумовно якось пов'язана з комп'ютером, але вона не є комп'ютером. Руки якось пов'язані з людиною, але вони не є людиною.

У цих випадках в його основі лежить інший тип відношення: не «є», а «є частиною» («HAS A»). Рука не є людиною, але є частиною людини. Клавіатура не є комп'ютером, але є частиною комп'ютера.

Відносини HAS A можна описати в коді, використовуючи механізми композиції і агрегування. Різниця між ними полягає у «суворості» цих зв'язків.

Наведемо простий приклад:

Ми маємо наш Car — авто.
У кожного авто є двигун.

Крім того, кожна машина має пасажирів усередині.

У чому принципова різниця між полями Engine engine і Passenger [] passengers? Якщо у машини всередині сидить пасажир А, це не означає, що в ній не можуть перебувати пасажири B и C.

Одна машина може відповідати кільком пасажирам. Крім того, якщо всіх пасажирів висадити із машини, вона продовжить спокійно функціонувати.

Зв'язок між класом Car і масивом пасажирів Passenger [] passengers менш суворий. Він називається агрегацією.

Наведемо ще один добрий приклад агрегації. Припустимо, у нас є клас Student, що позначає студента, і клас StudentsGroup (група студентів). Студент може входити до клубу любетелів фізики, і до студентського фан-клубу «Зоряних війн», і до клубу стендаперів.

Композиція — більш суворий тип зв'язку. При використанні композиції об'єкт не лише є частиною якогось об'єкту, але й не може належати до іншого об'єкта того ж типу.

Найпростіший приклад – двигун автомобіля. Двигун є частиною автомобіля, але не може бути частиною іншого автомобіля.

Як бачиш, їхній зв'язок значно суворіший, ніж у Car и Passengers.