Урок №150. Зависимость

  Юрий  | 

    | 

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

 3999

Мы уже успели рассмотреть 3 типа отношений в C++: композицию, агрегацию и ассоциацию. Самый простой тип отношений — зависимость, мы приберегли на конец.

В повседневной жизни мы используем термин «зависимость», чтобы указать, что один объект зависит от второго объекта для выполнения определённого задания. Например, если вы сломаете ногу, то будете зависеть от костылей, чтобы иметь возможность передвигаться (но не наоборот). Цветковые растения зависят от пчёл, которые опыляют их, чтобы те имели возможность размножаться (но не наоборот).

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

Хорошим примером зависимости, которую вы уже видели много раз, является std::cout (типа std::ostream). Классы используют std::cout для вывода чего-либо в консоль, но не наоборот. Например:

Результат выполнения программы выше:

Point(5, 6, 7)

Здесь класс Point не имеет прямого отношения к std::cout, но имеет зависимость от std::cout, так как функция перегрузки оператора << использует std::cout для вывода объектов класса Point в консоль.

Зависимость vs. Ассоциация

Очень часто возникает путаница: «А чем зависимость отличается от ассоциации?».

В C++ ассоциация — это отношения между двумя классами на уровне классов. То есть, первый класс сохраняет прямую или косвенную связь со вторым классом через переменную-член. Например, в классе Врач есть массив указателей на объекты класса Пациент в виде переменной-члена. Вы всегда можете спросить у Врача, кто его Пациенты. Класс Водитель содержит идентификатор Автомобиля в виде целочисленной переменной-члена. Водитель всегда знает к чему привязан Автомобиль и как получить к нему доступ.

Зависимости обычно не представлены на уровне классов, то есть зависимый объект не связан со вторым объектом через переменную-член. Зависимый объект обычно создаётся при необходимости (например, открытие файла для записи данных) или передаётся в функцию в качестве параметра (например, как std::ostream в перегрузке оператора << выше).


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

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

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

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