16.x – Резюме к главе 16 и небольшой тест
В данной главе мы узнали о некоторых типах связей между двумя объектами.
Краткое резюме
Процесс построения сложных объектов из более простых называется композицией объектов. Есть два типа композиции объектов: композиция и агрегация.
Композиция – это, когда связь члена класса к классу соответствует «часть чего-либо». В связи композиция класс управляет существованием членов. Чтобы квалифицироваться как композиция, объект и часть должны иметь следующие связи:
- компонент (член) является частью объекта (класса);
- компонент (член) может принадлежать только одному объекту (классу) одновременно;
- компонент (член) существует под управлением объекта (класса);
- компонент (член) не знает о существовании объекта (класса).
Композиции обычно реализуются с помощью обычных переменных-членов или указателей, где класс управляет всем выделением и освобождением памяти. Если вы можете реализовать класс как композицию, то так и делайте.
Агрегация – это, когда связь класса к члену соответствует «имеет что-либо». В связи агрегация класс не управляет существованием членов. Чтобы квалифицироваться как агрегация, объект и его части должны иметь следующие связи:
- часть (член) является частью объекта (класса);
- часть (член) может принадлежать более чем одному объекту (классу) одновременно;
- существование части (члена) не управляется объектом (классом);
- часть (член) не знает о существовании объекта (класса).
Агрегации обычно реализуются с помощью указателей или ссылок.
Ассоциации – это более свободный тип связи, когда класс «использует» не связанный с ним в противном случае объект. Чтобы считаться ассоциацией, объект и связанный объект должны иметь следующие связи:
- связанный объект (член) в противном случае не связан с объектом (классом);
- связанный объект (член) может принадлежать более чем одному объекту (классу) одновременно;
- существование связанного объекта (члена) не управляется объектом (классом);
- связанный объект (член) может знать или не знать о существовании объекта (класса).
Ассоциации могут быть реализованы с помощью указателей или ссылок или более косвенными средствами (такими как хранение индекса или ключа связанного объекта).
В зависимости один класс использует другой класс для выполнения какой-либо задачи. Зависимый класс обычно не является членом класса, использующего его, а скорее временно создается, используется, а затем уничтожается, или передается в функцию-член из внешнего источника.
В контейнерном классе один класс предоставляет контейнер для хранения нескольких объектов другого типа. Контейнер значений – это композиция, в которой хранятся копии объектов. Контейнер ссылок – это агрегация, в которой хранятся указатели или ссылки на объекты, которые находятся вне контейнера.
Класс 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
Выберите один вариант: если вы можете спроектировать класс, используя композицию, агрегацию, ассоциацию или зависимость, то как вы это сделаете?
Ответ
Композиция