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

  Юрий  | 

    | 

  Обновл. 24 Июн 2019  | 

 3623

 ǀ   4 

В этой главе мы рассмотрели типы отношений между двумя объектами в 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 (25 оценок, среднее: 4,96 из 5)
Загрузка...

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

  1. Аватар kmish:

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

    1. Аватар Илья:

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

  2. Аватар Артем:

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

    1. Юрий Юрий:

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

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

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