16.x – Резюме к главе 16 и небольшой тест

Добавлено 29 июля 2021 в 03:49

В данной главе мы узнали о некоторых типах связей между двумя объектами.

Краткое резюме

Процесс построения сложных объектов из более простых называется композицией объектов. Есть два типа композиции объектов: композиция и агрегация.

Композиция – это, когда связь члена класса к классу соответствует «часть чего-либо». В связи композиция класс управляет существованием членов. Чтобы квалифицироваться как композиция, объект и часть должны иметь следующие связи:

  • компонент (член) является частью объекта (класса);
  • компонент (член) может принадлежать только одному объекту (классу) одновременно;
  • компонент (член) существует под управлением объекта (класса);
  • компонент (член) не знает о существовании объекта (класса).

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

Агрегация – это, когда связь класса к члену соответствует «имеет что-либо». В связи агрегация класс не управляет существованием членов. Чтобы квалифицироваться как агрегация, объект и его части должны иметь следующие связи:

  • часть (член) является частью объекта (класса);
  • часть (член) может принадлежать более чем одному объекту (классу) одновременно;
  • существование части (члена) не управляется объектом (классом);
  • часть (член) не знает о существовании объекта (класса).

Агрегации обычно реализуются с помощью указателей или ссылок.

Ассоциации – это более свободный тип связи, когда класс «использует» не связанный с ним в противном случае объект. Чтобы считаться ассоциацией, объект и связанный объект должны иметь следующие связи:

  • связанный объект (член) в противном случае не связан с объектом (классом);
  • связанный объект (член) может принадлежать более чем одному объекту (классу) одновременно;
  • существование связанного объекта (члена) не управляется объектом (классом);
  • связанный объект (член) может знать или не знать о существовании объекта (класса).

Ассоциации могут быть реализованы с помощью указателей или ссылок или более косвенными средствами (такими как хранение индекса или ключа связанного объекта).

В зависимости один класс использует другой класс для выполнения какой-либо задачи. Зависимый класс обычно не является членом класса, использующего его, а скорее временно создается, используется, а затем уничтожается, или передается в функцию-член из внешнего источника.

В контейнерном классе один класс предоставляет контейнер для хранения нескольких объектов другого типа. Контейнер значений – это композиция, в которой хранятся копии объектов. Контейнер ссылок – это агрегация, в которой хранятся указатели или ссылки на объекты, которые находятся вне контейнера.

Класс std::initializer_list может использоваться для реализации конструкторов, операторов присваивания и других функций, которые принимают параметр списка инициализаторов. std::initailizer_list находится в заголовке <initializer_list>.

Сводные данные о композиции, агрегации, ассоциации и зависимости
СвойствоКомпозицияАгрегацияАссоциацияЗависимость
Тип связицелое/частьцелое/частьв противном случае не связаныв противном случае не связаны
Члены могут принадлежать нескольким объектам классанетдадада
Существование членов управляется классомданетнетнет
Направленностьоднонаправленнаяоднонаправленнаяоднонаправленная или двунаправленнаяоднонаправленная
Выражение связичасть чего-тоимеет что-тоиспользует что-тозависит от чего-либо

Небольшой тест

Эта глава довольно проста и немного более абстрактна, чем предыдущие, поэтому этот тест будет коротким и по существу.


Вопрос 1

Какой тип связи (композиция, агрегация, ассоциация или зависимость) описывается ниже?

1a) Класс Animal, содержащий тип животного (перечисление) и имя (строка).

Композиция – тип и имя животного не используются за пределами Animal.

1b) Класс текстового редактора с функцией save(), которая принимает объект File. Функция save() записывает содержимое редактора на диск.

Зависимость – класс текстового редактора использует объект File для сохранения на диск.

1c) Класс авантюриста Adventurer, который может нести различные виды предметов Item, такие как мечи, жезлы, зелья или книги заклинаний. Эти предметы могут быть выброшены и подобраны другими искателями приключений.

Агрегация – когда объекты Item связаны с объектом Adventurer, Adventurer имеет их. Меч, которым пользуется авантюрист, не может быть использован в этот же момент кем-либо еще. Но Adventurer не управляет существованием предметов.

1d) В классе (Classroom) находятся студенты (Student).

Ассоциация – Student и Classroom – это независимые объекты, которые связаны друг с другом в течение некоторого времени.

1e) Класс Computer, содержащий класс CPU. CPU можно извлечь из компьютера и протестировать отдельно.

Агрегация – Computer имеет CPU, но не управляет его существованием.


Вопрос 2

Выберите один вариант: если вы можете спроектировать класс, используя композицию, агрегацию, ассоциацию или зависимость, то как вы это сделаете?

Композиция

Теги

C++ / CppLearnCppstd::initializer_listДля начинающихКласс (программирование)ОбучениеОбъектно-ориентированное программирование (ООП)Программирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.