Каково различие между ассоциацией, агрегированием и составом?

Каково различие между ассоциацией, агрегированием и составом? Объясните с точки зрения реализации.

361
задан default locale 21 November 2019 в 18:37
поделиться

4 ответа

От: Remo H. Jansen книга «Beactning React: Изучение TypeScript 2.x - Второе издание»:

Мы называем ассоциацией те отношения, чьи объекты имеют независимый жизненный цикл, где есть нет собственности на объекты. Давайте посмотрим на пример учителя и ученика. Несколько учеников могут быть связаны с одним учителем, а один ученик может быть связан с несколькими учителями, но оба имеют независимые жизненные циклы (оба могут создавать и удалять независимо). Поэтому, когда учитель покидает школу, нам не нужно удалять учеников, а когда ученик покидает школу, нам не нужно удалять учителей.

Мы называем агрегацию теми отношениями, чьи объекты имеют независимый жизненный цикл, но есть владение, и дочерние объекты не могут принадлежать другому родительскому объекту. Давайте рассмотрим пример сотового телефона и аккумулятора сотового телефона. Одна батарея может принадлежать телефону, но если телефон перестает работать, и мы удаляем его из нашей базы данных, батарея телефона не будет удалена, потому что она все еще может функционировать. Таким образом, при агрегации при наличии владения объекты имеют свой жизненный цикл

. Мы используем термин состав для обозначения отношений, чьи объекты не имеют независимого жизненного цикла, и если родительский объект будет удален, все дочерние объекты также будут удалены. Давайте рассмотрим пример взаимосвязи между вопросами и ответами. Отдельные вопросы могут иметь несколько ответов, и ответы не могут принадлежать нескольким вопросам. Если мы удалим вопросы, ответы будут автоматически удалены.

1
ответ дан 23 November 2019 в 00:15
поделиться

I think this link will do your homework: http://ootips.org/uml-hasa.html

To understand the terms I remember an example in my early programming days:

If you have a 'chess board' object that contains 'box' objects that is composition because if the 'chess board' is deleted there is no reason for the boxes to exist anymore.

If you have a 'square' object that have a 'color' object and the square gets deleted the 'color' object may still exist, that is aggregation

Both of them are associations, the main difference is conceptual

5
ответ дан 23 November 2019 в 00:15
поделиться

Как говорили другие, ассоциация - это связь между объектами, агрегация и композиция - это типы ассоциации.

С точки зрения реализации агрегация достигается за счет наличия члена класса по ссылке . Например, если класс A агрегирует объект класса B, у вас будет что-то вроде этого (в C ++):

class A {
    B & element;
  // or B * element;
};

Семантика агрегации такова, что когда объект A уничтожается, объект B, который он хранит, все еще существует . При использовании композиции у вас более сильные отношения, обычно за счет сохранения члена по значению :

class A {
    B element;
};

Здесь, когда объект A уничтожается, содержащийся в нем объект B также будет уничтожен. Самый простой способ добиться этого - сохранить член по значению, но вы также можете использовать какой-нибудь умный указатель или удалить член в деструкторе:

21
ответ дан 23 November 2019 в 00:15
поделиться

С поста Роберт Мартин в Comp.Object :

Ассоциация представляет собой способность одного экземпляра отправить сообщение в другой случай. Это обычно реализуется с переменной указателя или ссылочной экземпляра, хотя он также может быть реализован в качестве аргумента метода или создание локальной переменной.

//[Example:]

//|A|----------->|B|

class A
{
  private:
    B* itsB;
};

Агрегация [...] - это типичные отношения всей части. Это точно так же, как ассоциация, за исключением, что экземпляры не могут иметь циклические отношения агрегации (то есть часть не может содержать его целое).

//[Example:]

//|Node|<>-------->|Node|

class Node
{
  private:
    vector<Node*> itsNodes;
};

Тот факт, что это агрегация означает, что экземпляры узла не могут образовывать цикл. Таким образом, это дерево узлов, а не график узлов.

Композиция [...] точно такая же, как агрегация, за исключением того, что срок службы «части» контролируется «целым». Этот контроль может быть прямым или транзитивным. То есть «целое» может принять прямую ответственность за создание или уничтожение «части», или она может принять уже созданную часть, а затем передать ее в какое-то другое целое, которое предполагает ответственность за него.

//[Example:]

//|Car|<#>-------->|Carburetor|

class Car
{
  public:
    virtual ~Car() {delete itsCarb;}
  private:
    Carburetor* itsCarb
};
28
ответ дан 23 November 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: