С# код для ассоциации, агрегации, композиции

Я пытаюсь подтвердить свое понимание того, как будет выглядеть код для объединения, агрегации и состава. Так вот идет..

Агрегация: Has-a. Он имеет существующий объект другого типа

public class Aggregation
{
    SomeUtilityClass objSC
    public void doSomething(SomeUtilityClass obj)
    {
      objSC = obj;
    }
}

Состав: состоит из другого объекта

public class Composition
{
    SomeUtilityClass objSC = new SomeUtilityClass();
    public void doSomething()
    {
        objSC.someMethod();
    }
}

Ассоциация. У меня есть два мнения об этом.

  • Когда один класс связан с другим. Следовательно, оба примера являются примерами ассоциации.
  • Ассоциация представляет собой более слабую форму агрегации, где класс не сохраняет ссылку на объект, который он получает.

    public class Association
    {
        //SomeUtilityClass objSC   /*NO local reference maintained */
        public void doSomething(SomeUtilityClass obj)
        {
           obj.DoSomething();
        }
    }
    

Правильно ли я понимаю? Я прочитал противоречивые статьи здесь и здесь, и поэтому я действительно не уверен, какой из них следует соблюдать. Мое понимание похоже на первое звено. Я чувствую, что вторая ссылка неверна, или, может быть, я не понял ее правильно.

Как вы думаете?

Ответ 1

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

  • Объект Car, содержащий четыре объекта Wheel. Обычно, если вы уничтожаете автомобиль (вызывая какой-то метод его очистки), вы также должны уничтожать колеса в процессе, так как для них нет никакого смысла существовать вне автомобиля (если вы не переместите их на другой объект Car), Более реалистично, объект-читатель, обертывающий входной поток, также закрывает внутренний поток, когда он сам закрывается. Это состав.
  • Объект Person содержит (владеет) объект Radio. Если Person умирает, Radio может быть унаследован другим Person, то есть имеет смысл, чтобы он существовал без первоначального владельца. Более реалистично, список, содержащий объекты, не требует, чтобы все объекты удалялись, когда сам список был удален. Это агрегация.

Изменить. После прочтения ваших ссылок я был бы склонен перейти к первому, так как он дает объяснение, подобное моему.

Также association просто вызывает метод (отправляет сообщение) другому объекту посредством ссылки на этот объект.

Ответ 2

Да, вы понимаете правильно! Раньше у меня были те же сомнения, но затем я нашел здесь здесь

хорошо объяснил и помог мне.

Для двух объектов Foo и Bar отношения могут быть определены

Ассоциация. У меня есть отношение к объекту. Foo использует Bar

public class Foo { 
void Baz(Bar bar) {
}  };

Состав. У меня есть объект, и я несу ответственность за его жизнь, когда Foo умирает, то и Bar

public class Foo {
private Bar bar = new Bar();  }

Агрегация. У меня есть объект, который я заимствовал у кого-то другого. Когда Foo умирает, Бар может жить.

public class Foo { 
private Bar bar; 
Foo(Bar bar) { 
   this.bar = bar; 
} }