Я просматриваю прошлые экзаменационные работы для ООП и сталкиваюсь с вопросом: можно ли использовать приведенное ниже определение класса для реализации отношения композиции между классами Person и Brain?

abstract class Person{
   private Brain brain;
   Person(Brain humanBrain) {
      brain = humanBrain;
   }
}

У меня сложилось впечатление, что из приведенного кода уже существует соотношение композиции между ними, однако, поскольку вопрос также требует примеров кода, я полагаю, что я ошибаюсь. Было бы оценено объяснение того, как реализовать композицию или, более того, почему это уже не считается отношением композиции между ними.

2
JNMN 1 Янв 2018 в 21:03

2 ответа

Лучший ответ

Мы знаем определение композиции UML и можем найти множество примеров в SO и в Интернете. Но я думаю, нам следует изучить ситуацию подробнее.

Прежде всего : пояснение по поводу состава .
В композиции (см. Ссылку):

если составное (целое) удаляется, все его составные части «обычно» удаляются вместе с ним.

Рассмотрим этот пример:

class Person {
   private final Brain brain;
   Person(Brain humanBrain) {
      brain = humanBrain;
   }
}

А в других частях кода мы можем определить так:

Brain b = new Brain(); 
       // or we have an instance of Brain in other scopes
       // not exactly in this scope

Person p1 = new Person(b);
Person p2 = new Person(b);

Итак, в этом коде мы можем установить один экземпляр Brain на два разных Persons.

Примечание . В составе мы должны управлять жизненным циклом экземпляров . Определяя только private final любого класса, не показывайте композицию между ними.

Например, в примере ниже может быть композиция. Поскольку экземпляры «Части» удаляются при удалении «целого»:

public class House {    
   private final Room room;

   public House() {    
       room = new Room();
   }
}

В композиции:
«Целое» может нести прямую ответственность за создание или разрушение «части». Или он может использовать «часть», которая уже была создана и управляется извне класса (другими частями кода). В этом случае удаление «части» должно управляться внешним кодом, а «часть» должна удаляться сразу после удаления «целого».

Мы должны создать механизм для удаления «части» при удалении «целого». Если мы не удалим «часть» и не будем использовать ее в других «целых», это будет агрегирование .

Подводя итоги
Обнаружение композиции в исходном коде должно иметь полную реализацию кода. И мы должны гарантировать , что «часть» удаляется сразу же после удаления «целого».

Другой момент в вопросе - абстрактный . Итак, в этом коде нет объектной композиции или объектной агрегации.

Наконец : отношение в вопросе - композиция (основано только на концепции личности и мозга). Но из данного исходного кода это еще не композиция.

1
Gholamali-Irani 1 Янв 2018 в 21:44

Лучше определить мозг как final, отличая его от агрегирования, как подробно описано здесь: http://javarevisited.blogspot.co.uk/2014/02/ifference-between-association-vs-composition-vs-aggregation.html

1
Johan Witters 1 Янв 2018 в 18:36