Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Агрегация и композиция



Предположим, имеются два объекта А и B разных классов. Между ними можно установить отношение агрегации, если справедливым является утверждение типа: «объект A является составной частью объекта B». В этом случае одно или несколько свойств объекта В представляют собой объекты класса А или каких-то других классов. Механизм агрегации позволяет создавать сложные объекты на основе более простых объектов.

Примеры использования отношения агрегации:

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

· Объект «массив линейных списков» включает в себя отдельные объекты-списки, каждый из которых в свою очередь состоит из объектов-элементов; здесь агрегация является нестрогой, т.к. вполне могут существовать пустые списки и пустой массив в целом

· Объект-компьютер можно рассматривать как набор более простых объектов, таких как процессор, память, монитор, жесткий диск, каждый из которых при необходимости можно разбить на еще более простые объекты; этот случай является смешанным, поскольку процессор и память абсолютно необходимы для функционирования компьютера, тогда как монитор или жесткий диск как составные части могут и отсутствовать

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

Для программной реализации агрегации необходимо выполнить следующие шаги.

1. При описании нового составного класса включить в набор его свойств одно или несколько объектных свойств. За исключением статических объектов в С++, такие объектные свойства на самом деле являются указателями на объекты ранее описанных классов. Например, объект-отрезок как набор двух объектов-точек схематично можно представить следующим образом:

 
 


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

3. При реализации методов составных объектов необходимо использовать методы вложенных объектов. Именно здесь возникает возможность повторного использования ранее созданного кода.

В качестве примера рассмотрим реализацию отношения агрегации для классов Точка – Окружность – Кольцо.


Описание класса точек:

TPoint = class

private

x, y: integer;

public

constructor Create (ax, ay: integer);

procedure SetXY (ax, ay: integer);

function GetX: integer;

function GetY: integer;

end;

Описание класса окружностей с помощью введенного ранее класса точек:

TCircle = сlass

private

center: TPoint; // объектное свойство-указатель на точку

r: integer;

public

constructor Create (ax, ay, ar: integer); overload;

constructor Create (acenter: TPoint; ar: integer); overload;

procedure Show;

procedure MoveTo (ax, ay: integer); overload;

procedure MoveTo (anew: TPoint); overload;

procedure SetRad (ar: integer);

function GetRad: integer;

end;

Приведем примеры реализации некоторых методов класса окружностей:

constructor TCircle.Create (ax, ay, ar: integer);

begin

center:= TPoint.Create (ax, ay); // сначала создаем объект-точку

r:= ar;

end;

constructor TCircle.Create (acenter: TPoint; ar: integer);

begin

center:= acenter; // а здесь используем ранее созданную точку

r:= ar;

end;

procedure TСircle.Show;

begin

«прорисовка окружности с использованием методов доступа

center.GetX и center.GetY, т.к. свойства x и y закрыты для объектов-окружностей»

end;

procedure TCircle.MoveTo (ax, ay: integer);

begin

Show; center.SetXY(ax, ay); Show;

end;

Описание класса колец:

TRing = class

private

circ1, circ2: TCircle; // два объектных свойства-указателя

public

constructor Create (ax, ay, ar1, ar2: integer); overload;

constructor Create (acirc1, acirc2: TCircle); overload;

procedure Show;

procedure MoveTo (ax, ay: integer);

end;

Реализация методов класса колец:

constructor TRing.Create (ax, ay, ar1, ar2: integer);

begin

circ1:= TCircle.Create (ax, ay, ar1);

circ2:= TCircle.Create (ax, ay, ar2);

end;

constructor Tring.Create (acirc1, acirc2: TCircle);

begin

circ1:= acirc1;

circ2:= acirc2;

end;

procedure TRing.Show;

begin

circ1.Show;

circ2.Show;

end;

procedure TRing.MoveTo (ax, ay: integer);

begin

circ1.MoveTo (ax, ay);

circ2.MoveTo (ax, ay);

end;

Фрагмент программы, использующей описанные классы:

var

MyPoint: TPoint;

MyCirc1, MyCirc2: TCircle;

MyRing: TRing;

.................

begin

MyCirc1:= TCircle.Create (100, 100, 50); // создание окружности

MyPoint:= TPoint.Create (100, 100); // создание точки

MyCirc2:= TCircle.Create (MyPoint, 150); // вторая окружность

MyRing:= TRing.Create (100, 100, 50, 150); // первый способ

MyRing:= TRing.Create (MyCirc1, MyCirc2); // второй способ

MyRing.Show; MyRing.MoveTo (200, 200);

..........

end;

Для указания агрегационных связей между классами в языке UML предусмотрены соответствующие графические средства. Например, в случае нестрогой агрегации связи между классами задаются линиями с незаполненными ромбиками на конце, причем эти ромбики ставятся у составного класса. Дополнительно на линии может указываться мощность связи, т.е. возможное число объектов в составе агрегированного объекта. Например:

 
 


Для строгой ассоциации (композиции) вместо пустых ромбиков используются сплошные заполненные ромбики. Например, композиционные связи между классами Точка, Окружность, Прямоугольник и Кольцо можно представить следующим образом:

 
 





Дата публикования: 2014-11-02; Прочитано: 1260 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...