Глава №10. Итоговый тест

  Юрий  | 

  |

  Обновл. 17 Окт 2020  | 

 22351

 ǀ   9 

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

Теория

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

В композиции типом отношений между членом и классом является «часть чего-то» (член является «частью» класса). В композиции класс управляет существованием членов. Для реализации композиции части и объект должны соответствовать следующим правилам:

   Часть (член) является частью объекта (класса).

   Часть (член) может принадлежать только одному объекту (классу) в моменте.

   Существование части (члена) управляется объектом (классом).

   Часть (член) не знает о существовании объекта (класса).

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

В агрегации типом отношений между членом и классом является «имеет» (класс «имеет» члены). В отношениях агрегации класс не управляет существованием членов. Для реализации агрегации части и объект должны соответствовать следующим правилам:

   Часть (член) является частью объекта (класса).

   Часть (член) может принадлежать более чем одному объекту (классу) в моменте.

   Существование части (члена) не управляется объектом (классом).

   Часть (член) не знает о существовании объекта (класса).

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

В ассоциации объекты не связаны между собой, нет отношений типа «части-целое». Для реализации ассоциации объекты должны соответствовать следующим правилам:

   Первый объект (член) не связан со вторым объектом (классом).

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

   Существование первого объекта (члена) не управляется вторым объектом (классом).

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

Ассоциации могут быть реализованы как через указатели, так и через ссылки.

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

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

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

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

Тест


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

Задание №1

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

a) Класс Животное, который содержит Тип Животного и его Имя.

Ответ №1.a)

Композиция. Тип Животного и его Имя не используются вне класса Животное.

b) Класс TextEditor с методом Save(), который принимает объект file. Метод Save() записывает содержимое редактора на диск.

Ответ №1.b)

Зависимость. Класс TextEditor использует объект file для выполнения определенного задания — сохранения объекта на диск.

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

Ответ №1.c)

Агрегация. Когда Предметы связаны с Авантюристом, то Авантюрист «имеет» эти предметы. Меч, используемый Авантюристом, не может одновременно быть использован другим Авантюристом. Но Авантюрист не управляет существованием самих Предметов.

d) Программист использует Компьютер для просмотра видео с котами в Интернете.

Ответ №1.d)

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

e) Класс Компьютер, который содержит класс Процессор. Процессор можно вынуть из Компьютера и посмотреть.

Ответ №1.e)

Агрегация. Компьютер имеет Процессор, но не управляет его существованием.

Задание №2

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

Ответ №2

Композиция.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (120 оценок, среднее: 4,92 из 5)
Загрузка...

Комментариев: 9

  1. Сергей:

    Несколько лет назад увлекался фильмографией актёров, тогда писал на Clipper. Пришлось поморочиться с фунциями формирования базы для ассоциативных свзязей актёров, фильмов, режиссёров.
    И вот сейчас увидел довольно прозрачную структуру взаимосвязей.
    Вот, оказывается, где собака порылась! 🙂

  2. Bop_HockoB:

    По моему задание 1.e — ассоциация, так как проц не будет работать без питания пк, а пк без обработки данных

    1. Юрий:

      Один процессор может стоять одновременно в дух компьютерах? Нет. Значит композиция.

  3. Vlad:

    В задании 1.с какой-то замкнутый круг получается:
    Поскольку сам меч существует отдельно от авантюриста и авантюрист не управляет временем жизни меча, то подходит агрегация (связь однонаправленная). В то же время, исходя из правил агрегации, класс (член) может принадлежать сразу нескольким объектам (классам), соответсвенно меч не обязательно будет принадлежать только одному авантюристу в моменте (что не логично, ведь меч должен принадлежать только одному авантюристу в моменте, два авантюриста не должны владеть одним мечом).
    Поэтому мне кажется, что агрегация не совсем подходит тут.

    Поправьте меня пожалуйста, если я не прав. Возможно я что-то не правильно понял.

  4. cybersatori:

    вчера дочитал главу настроился что завтра буду решать строгий тест, а тут изи катка, обманчиво приятно)

  5. kmish:

    Программист использует Компьютер для просмотра видео с котами в Интернете.
    Непонятно…
    А чем это не зависимость? Объект Программист использует метод объекта Компьютер для выполнения определенного задания — просмотра видео котиков.

    1. Илья:

      Тут связано с продолжительностью жизни,если бы это была зависимость, то с твоей смертью ПК разрушался бы,
      в ассоциации и агрегации время жизни объектов не зависит от целого класса.
      Можно было бы ещё сказать что это зависимость,если бы каждый раз,для того,что бы "посмотреть видео с котами" программист бы одалживал у кого-либо ПК но и тут спорно..

  6. Артем:

    Чисто из интереса, мы далеко продвинулись в изучении C++? Много еще будет уроков?

    1. Фото аватара Юрий:

      Ну еще где-то уроков 50-60 будет.

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *