Предположим, имеются два объекта А и B разных классов. Между ними можно установить отношение агрегации, если справедливым является утверждение типа: «объект A является составной частью объекта B». В этом случае одно или несколько свойств объекта В представляют собой объекты класса А или каких-то других классов. Механизм агрегации позволяет создавать сложные объекты на основе более простых объектов.
Примеры использования отношения агрегации:
· Связь между объектами-точками и другими объектами-примитивами: окружность содержит точку-центр, отрезок содержит две точки (концы отрезка), многоугольник содержит массив угловых точек; можно рассматривать объект-кольцо как набор двух объектов-окружностей и т.д.; данный вид агрегации является строгим, т.е. композицией, поскольку существование составного объекта неразрывно связано с существованием образующих его частей
· Объект «массив линейных списков» включает в себя отдельные объекты-списки, каждый из которых в свою очередь состоит из объектов-элементов; здесь агрегация является нестрогой, т.к. вполне могут существовать пустые списки и пустой массив в целом
· Объект-компьютер можно рассматривать как набор более простых объектов, таких как процессор, память, монитор, жесткий диск, каждый из которых при необходимости можно разбить на еще более простые объекты; этот случай является смешанным, поскольку процессор и память абсолютно необходимы для функционирования компьютера, тогда как монитор или жесткий диск как составные части могут и отсутствовать
Большим достоинством агрегации является возможность сведения сложных объектов к набору объектов более простой природы. С точки зрения программной реализации агрегация дает возможность использовать уже существующие поля данных и реализовывать методы составного объекта на основе повторного использования кода для ранее созданных более простых объектов.
Для программной реализации агрегации необходимо выполнить следующие шаги.
1. При описании нового составного класса включить в набор его свойств одно или несколько объектных свойств. За исключением статических объектов в С++, такие объектные свойства на самом деле являются указателями на объекты ранее описанных классов. Например, объект-отрезок как набор двух объектов-точек схематично можно представить следующим образом:
2. В тех случаях, когда существование составного объекта невозможно без существования образующих его объектов, важным становится порядок работы конструкторов. Конструктор составного объекта должен либо сам сначала создать входящие в него объекты, либо получить ссылки на ранее созданные объекты как входные параметры. Это требует внимательного отношения к реализации конструкторов составных объектов. В случае сложных композиционных связей это может приводить к ситуации вложенных вызовов конструкторов.
3. При реализации методов составных объектов необходимо использовать методы вложенных объектов. Именно здесь возникает возможность повторного использования ранее созданного кода.
В качестве примера рассмотрим реализацию отношения агрегации для классов Точка – Окружность – Кольцо.