Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Предположим, имеются два объекта А и 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; Прочитано: 1262 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!