Файл: 5. Взаимодействие объектов. Агрегация и композиция.pdf

Добавлен: 20.10.2018

Просмотров: 1584

Скачиваний: 9

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

 

};

 

 

2. Если объекты-части уже созданы, подходят для составного объекта и 

известны  адреса  их  размещения  в  памяти,  то  можно  передать  эти  адреса 

как входные параметры конструктору, который должен лишь использовать 

эти  значения  для  установки  соответствующих  связующих  объектных 

свойств.  Для  этого  достаточно  объявить  входные  параметры  конструктора 

как переменные классового типа: 

constructor  TComputer.Create (aCPU : TCPU;   aMem : TMem); 

begin 

   cpu := aCPU;  // установка связи с существующим объектом 

   mem := aMem;   // установка связи с существующим объектом 

   // установка обычных свойств 

end;

 

 

public  Computer (CPU   aCPU,  Memory   aMem) { 

   cpu =  aCPU;   // установка связи с существующим объектом 

   mem =  aMem;   // установка связи с существующим объектом 

   // установка обычных свойств 

};

 

 

Возможна  и  комбинация  этих  способов,  когда  часть  объектов 

создается, а часть используется в качестве уже существующих. 

Что  касается  вызова  методов  объектов-частей  в  методах  составных 

классов, то он выполняется стандартным образом с использованием имени 

объектного свойства и имени метода

cpu.SomeMethod( ); 

 


background image

 

 

В  заключение  приведем  перечень  основных  шагов,  которые 

необходимо  выполнить  для  реализации  агрегационного  (композиционного) 

взаимодействия объектов: 

  определить  возможность  и  целесообразность  применения  данного 

способа для выявленных объектов 

  разработать (при необходимости) классы для объектов-частей 

  разработать класс составных объектов с включением в его структуру 

объектных (связующих) свойств 

  реализовать конструктор(ы) составных классов  

  реализовать  методы  составных  классов  с  вызовом  (при 

необходимости)  ранее  созданных  методов  связанных  с  ними 

объектов. 

 

В  качестве  примера  рассмотрим  задачу  разработки  классов  для 

графических  объектов.  Решение  данной  задачи  проведем  в  соответствии  с 

описанными  выше  шагами.  Целью  является  использование  механизма 

агрегации/композиции  для  построения  эффективного  набора  классов 

графических объектов. 

Исходные объекты (графические примитивы): Окружность

ПрямоугольникОтрезок и др. 

Анализ объектов: 

   Окружность: содержит координаты центра и методы доступа к ним 

   Прямоугольник: содержит координаты базовой точки (например — 

левый верхний угол) и методы доступа к ним 

   Отрезок: содержит координаты одного из концов и методы доступа к ним 

Вывод:  объекты  имеют  повторяющиеся  данные  и  методы,  которые 

целесообразно вынести во вспомогательный класс точек. 

Объекты класса «Точка» можно включать как составные части в основные 

объекты-примитивы. 


background image

 

 

В  свою  очередь,  объекты-примитивы  можно  использовать  как    части  более 

сложных  составных  графических  объектов  (например,  типа 

«Деталь») 

 

Такой подход несомненно является  более эффективным по сравнению с 

описанием  каждого  класса  «с  нуля».  Для  примера  можно  сравнить  два 

описания  класса  для  объекта  «Простая  деталь»,  состоящего  из 

прямоугольника и окружности: 

  описание  «с  нуля»  потребует  введения  семи  свойств  (три  для 

окружности  и  четыре  для  прямоугольника)  и  (в  общем  случае)  14-ти 

методов доступа! 

  описание  на  основе  композиции,  как  будет  видно  из  дальнейшего 

материала, потребует лишь ДВУХ объектных свойств! 

 

Описание классов начинается с класса точек, который в рамках данной 

информационной  модели  определяет  элементарные  «неделимые»  объекты. 

Класс  очень  простой,  отвечает  за  хранение  двух  целых  чисел-координат  и 

доступ к ним через соответствующие методы. 

TPoint = class 

   private 

   x, y : integer

   public 

constructor  Create(ax, ay: integer); 

procedure  SetXY (ax, ay : integer); 

function  GetX : integer; 

 function  GetY : integer; 

end; 

class   Point  { 

   private  int  x, y; 

   public  Point  (int  ax, int  ay) 

{…}; 

   public  void  SetXY (int ax,  int 

ay) {…}; 

   public  int   GetX( ) {…}; 

   public  int   GetY( ) {…}; 

};

 

 


background image

 

 

Новый  (улучшенный)  класс  окружностей  будет  реализован  уже  как 

составной и поэтому будет иметь следующие отличия от реализованного «с 

нуля»: 

  вместо  двух  свойств  целого  типа  с  именами    x  и    y    вводится 

объектное  свойство  с  именем    Center,  в  котором  во  время 

выполнения  программы  будет  содержаться  адрес  объекта-точки, 

используемого  для  хранения  координат  центра  окружности;  можно 

сказать,  что  класс  окружностей  делегирует  работу  с  координатами 

своего центра классу точек 

  класс  может  иметь  два  конструктора  с  разными  наборами 

параметров для создания окружностей разными способами, т.е. либо с 

созданием необходимого объекта-точки, либо с использованием уже 

существующей точки 

  методы  доступа  к  координатам  центра  уже  не  нужны,  т.к.  они 

реализованы  в  классе  точек  и  могут  быть  вызваны  при 

необходимости; в классе остаются только методы доступа к радиусу 

  методы  прорисовки  и  перемещения  окружности  вместо  прямого 

использования  координат  центра  должны  обращаться  к  методам 

доступа  класса  точек,  поскольку  эти  координаты  теперь  объявлены 

как закрытые свойства «чужого» для окружностей класса 

 

TCircle = сlass 

     private  

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

          r : integer

      public 

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

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

          procedure  SetRad (ar : integer); 


background image

 

 

          function  GetRad : integer

          procedure  Show; 

          procedure  MoveTo (ax, ay : 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  

    end; 

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

     begin 

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

     end;

 

 

 

сlass   Circle  { 

   private    Point   Center;   // объектное свойство-указатель на точку 

   private    int   r;