Я розумію, що таке склад в ООП, але я не в змозі скласти чітке уявлення про те, що таке Агрегація. Може хтось пояснить?
Я розумію, що таке склад в ООП, але я не в змозі скласти чітке уявлення про те, що таке Агрегація. Може хтось пояснить?
Відповіді:
Прості правила:
Приклад 1:
Компанія - це сукупність людей. Компанія - це склад Рахунків. Коли компанія припиняє свою діяльність, її рахунки перестають існувати, але її люди продовжують існувати.
Приклад 2: (дуже спрощено)
Текстовому редактору належить буфер (композиція). Текстовий редактор використовує файл (агрегація). Коли редактор тексту закритий, буфер знищується, але сам файл не знищується.
З http://en.wikipedia.org/wiki/Object_composition
Агрегація відрізняється від звичайного складу тим, що вона не передбачає права власності. За складом, коли об’єкт, що володіє, знищується, так і об'єкти, що містяться. У сукупності це не обов'язково вірно. Наприклад, університету належать різні кафедри (наприклад, хімія), і на кожному кафедрі є декілька професорів. Якщо університет закриється, кафедри більше не існуватимуть, але професори на цих кафедрах продовжуватимуть існувати. Отже, університет можна розглядати як склад кафедр, тоді як кафедри - це професори. Крім того, професор може працювати на більш ніж одній кафедрі, але кафедра не може бути частиною більш ніж одного університету.
Отже - хоча у вас є відносини власності зі складом, об'єкт, що належить, також знищується, коли власник є - агрегація (і об'єкти, що містяться) можуть існувати незалежно.
-
Оновлення: Вибачення - ця відповідь є занадто спрощеною задля огляду.
c.batt дає чудове визначення у своїй відповіді: Агрегація проти складу
Єдиного пояснення немає. Різні автори означають різні речі за сукупністю. Більшість насправді не означає нічого конкретного.
Склад - Асоціація
Агрегація - Асоціація
Склад - це сильна асоціація (якщо термін зберігання об'єкта повністю залежить від контейнерного об'єкта, це називається сильною асоціацією)
Агрегація є слабкою асоціацією (якщо термін зберігання об'єкта не залежить від контейнерного об'єкта, це називається слабкою асоціацією)
Приклад:
class Contained {
public void disp() {
System.out.println("disp() of Contained A");
}
}
public class Container {
private Contained c;
//Composition
Container() {
c = new Contained();
}
//Association
public Contained getC() {
return c;
}
public void setC(Contained c) {
this.c = c;
}
public static void main(String[] args) {
Container container = new Container();
Contained contained = new Contained();
container.setC(contained);
}
}
Композиція (суміш) - це спосіб об’єднання простих об'єктів або типів даних у більш складні. Композиції є критичним складовим елементом багатьох базових структур даних
Агрегація (колекція) відрізняється від звичайного складу тим, що не передбачає права власності. За складом, коли об’єкт, що володіє, знищується, так і об'єкти, що містяться. У сукупності це не обов'язково відповідає дійсності
╔═══════════╦═════════════════════════╦═══════════════════════╗
║ ║ Aggregation ║ Composition ║
╠═══════════╬═════════════════════════╬═══════════════════════╣
║ Life time ║ Have their own lifetime ║ Owner's life time ║
║ Relation ║ Has ║ part-of ║
║ Example ║ Car has driver ║ Engine is part of Car ║
╚═══════════╩═════════════════════════╩═══════════════════════╝
Обидва позначають зв'язок між об'єктом і відрізняються лише своєю міцністю.
Нотації UML для різного виду залежності між двома класами
Склад : Оскільки двигун є частиною автомобіля, відносини між ними складаються. Ось як вони реалізовані між класами Java.
public class Car {
//final will make sure engine is initialized
private final Engine engine;
public Car(){
engine = new Engine();
}
}
class Engine {
private String type;
}
Агрегація : Оскільки в Організації є Особа як співробітники, відносини між ними є Агрегацією. Ось як вони виглядають з точки зору класів Java
public class Organization {
private List employees;
}
public class Person {
private String name;
}
агрегація - це проста колекція, як мішок з мармуром
композиція передбачає внутрішні / функціональні залежності, як петлі на коробці
автомобілі агрегатують пасажирів; вони заходять і виходять, не порушуючи функціональність автомобіля
шини - компоненти; видаліть його, і автомобіль більше не працює належним чином
[зверніть увагу: запасна шина - це агрегат!]
Я завжди розглядаю склад як "потребує", тобто автомобіль потребує двигуна, і я розглядаю сукупність як "речі, пов'язані з певною метою". Таким чином, дотримуючись аналогії автомобіля, моє агрегування може означати подорож, яка може включати об'єднання автомобіля та пасажирів. Подорож не належить ні автомобілю, ні пасажирам, я агрегую дані, які пов'язані з конкретним сценарієм. Коли подорож завершена, автомобіль і пасажири їдуть далі. Коли автомобіль закінчений, автомобіль і його двигун зазвичай руйнуються разом.
Семантично всі набори складаються з підмножини, правда? Тому:
Агрегація - це коли ці підмножини існують незалежно від набору батьків. Оскільки монітор можна відключити від комп'ютера для підключення до іншого.
Склад складається тоді, коли ці підмножини залежать від існування набору батьків. Оскільки листя - це частина дерева, а печінка - частина тіла.
Ці поняття говорять про тип залежності між двома об'єктами чи класами, концептуально. Безпосередньо в програмі, в агрегації, коли об'єкт батька розпоряджається, об’єкти сукупності також повинні бути розміщені. У тому ж сценарії для композиції складені об'єкти сина зберігатимуться, тоді об'єкт батька відпускається.
Як щодо цього простого прикладу:
Масив об’єктів - це композиція. Масив покажчиків на об’єкти - це агрегація.
Якщо я видалю перший, його вміст зникає разом із ним. Другий, з іншого боку, може зникнути, не впливаючи на існування своїх членів, якщо не існує конкретного методу, який видаляє кожен об'єкт, оскільки його вказівник видаляється.