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

Добавлен: 20.10.2018

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

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

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

 

 

 

   public  Circle (int  ax, int  ay, int  ar)  

      { Center = new  Point (ax, ay);   r = ar;} // создание объекта-точки 

   public  Circle (Point   aCenter,  int  ar)  

      { Center = aCenter;  r = ar;}  // использование существующей точки 

   public   void  SetRad (int   ar) {…} 

   public   int   GetRad ( ) {…} 

   public   void  Show( ) { // прорисовка окружности с использованием 

                              // методов доступа    Center.GetX( )  и  Center.GetY( ) } 

   public  void  MoveTo (int   ax,  int   ay)  

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

 };

 

 

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

 

 

 

 

 

 

Аналогично  можно  определить  составной  класс  прямоугольников  в 

одном из двух вариантов: 

  через  координаты  верхнего  левого  угла,  ширину  и  высоту  (одно 

объектное свойство-указатель на точку) 

  через  координаты  верхнего  левого  и  правого  нижнего  углов  (два 

объектных свойства-указателя на две точки) 

TRect = сlass       // первый способ 

   private  

       TopLeft : TPoint;  // объектное свойство для координат угловой точки 

        h, w : integer; 

   public 

  координата  х  
  координата  у 

 

 

  объект-окружность

 

  объект-точка

 

  объектное свойство-указатель  
  на объект-точку 
  радиус

 

 


background image

 

 

        constructor  Create (ax, ay, ah, aw : integer); overload; 

        constructor  Create (aTL : TPoint;  ah, aw : integer); overload; 

        // не забыть: методы доступа к полям h и w 

        procedure  Show;                  // реализация - через методы доступа 

        procedure  MoveTo (ax, ay : integer);  // аналогично 

  end; 

 

Реализация конструкторов: 

constructor  TRect.Create (ax, ay, ah, aw : integer); 

    begin 

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

          h := ah;   w := aw; 

    end;   

constructor  TCircle.Create (aTL : Tpoint;  ah, aw : integer); 

    begin 

         TopLeft := aTL;   // использование ранее созданной точки 

         h := ah;   w := aw; 

    end;

 

 

сlass   Rect  { 

   private    Point   TopLeft;   // объектное свойство для координат угла 

   private    int   h, w; 

 

   public  Rect (int  ax, int  ay, int  ah,  int  aw)  

      { TopLeft = new  Point (ax, ay); // создание объекта для угловой точки 

          h = ah;   w = aw;}  

   public  Rect (Point   aTL,  int  ah,  int  aw)  // использование объекта-точки 

      { TopLeft = aTL;  h = ah;   w = aw;}  

   public . . . . .    // методы доступа к полям h и w 

   public   void  Show( ) { // прорисовка прямоугольника с использованием 


background image

 

 

                              // методов доступа    TopLeft.GetX( ),  TopLeft.GetY( ) }              

   public  void  MoveTo (int   ax,  int   ay)  

      { Show( );  TopLeft.SetXY(ax, ay);   Show( ); } 

 };

 

 

После  создания  классов  для  окружностей  и  прямоугольников  можно 

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

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

рамках  составного  объекта  «Простая  деталь»,  причем  практически  вся 

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

методами соответствующих классов. Для этого достаточно в класс «Простая 

деталь»  включить  два  объектных  свойства  для  адресации  объектов 

«Окружность» и «Прямоугольник».

 

 

TDetal = сlass 

   private  

 Circ : TCircle;    // поле для связи с объектом-окружностью 

 Rect :  TRect;      // поле для связи с объектом-прямоугольником 

   public 

     constructor  Create (aCx, aCy, ar, aRx, aRy, ah, aw : integer); overload; 

constructor  Create (aCir : TCircle;  aRect : TRect); overload; 

procedure  Show;   

procedure  MoveTo (ax, ay : integer);  

end; 

 

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

   constructor  TDetal.Create (aCx, aCy, ar, aRx, aRy, ah, aw : integer); 

      begin 

  Circ := TCircle.Create (aCx, aCy, ar);  // создание объекта-окружности 

         Rect := TRect.Create (aRx, aRy, ah, aw); //создание прямоугольника 


background image

 

 

      end;   

   constructor  TDetal.Create (aCir : TCircle;  aRect : TRect); 

      begin 

   Circ := aCir;   // использование ранее созданной окружности 

   Rect := aRect;   // использование прямоугольника 

      end; 

   procedure   TDetal.Show;   // аналогично - метод перемещения 

      begin 

         Circ.Show;   Rect.Show;    // и все, больше ничего не надо! 

      end; 

 

 

сlass   Detal  { 

   private    Circle   circ;   // поле для связи с объектом-окружностью 

   private    Rect    rect;    // поле для связи с объектом-прямоугольником 

 

   public  Detal (int  aCx, int  aCy, int  ar, int  aRx,  int  aRy, int  ah, int  aw)  

      { circ = new  Circle (aCx, aCy, ar); // создание окружности 

          rect = new  Rect (aRx, aRy, ah, aw);} // и прямоугольника 

   public  Detal (Circle   aCirc,  Rect   aRect)  // использование 

      { circ = aCirc;  rect = aRect;} // существующих объектов 

   public   void  Show( ) { circ.Show( );  rect.Show( ); }  // очень просто! 

   public  void  MoveTo (int   ax,  int   ay)  

      { circ.MoveTo(ax, ay);  rect.MoveTo(ax, ay); } 

 };

 

 

Схема взаимодействия объектов при выполнении программы:

 

 

 

 

 объект-окружность

 

 объекты-точки

 

  координата х  
  координата у 

 

 

  объектное  
  свойство-точка 
  радиус 

 

 

  объектное свойство                      
« окружность» 
  объектное свойство 
  «прямоугольник»

 

 

 объект «Деталь»

 


background image

 

 

 

 

 

 

 

           

 

Ниже  приводятся  фрагменты  демонстрационных  программ,  в  которых 

разными способами создаются объекты описанных выше классов. 

var 

   MyPoint1, MyPoint2 : TPoint; 

   MyCirc1, MyCirc2 : TCircle; 

   MyRect : TRect; 

   MyDetal : TDetal; 

begin 

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

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

   MyCirc2 := TCircle.Create (MyPoint1, 50);   // окружность: второй способ    

   MyPoint2 := TPoint.Create (300, 200);       // еще одна точка 

   MyRect := TRect.Create (MyPoint2, 200, 100);   // прямоугольник 

   MyDetal := TDetal.Create (100, 100, 50, 50, 50, 200, 300);   //  деталь «с нуля» 

   MyDetal := TDetal.Create (MyCirc1, MyRect);   //  используем созданные 

   MyDetal.Show;   

   MyDetal.MoveTo (200, 200);  

 

 

   

   Point   MyPoint1, MyPoint2; 

   Circle   MyCirc1, MyCirc2; 

   Rect   MyRect; 

  координата х  
  координата у 

 

 

  объектное  
  свойство-точка 
  объектное  
  свойство-точка

 

 

  координата х  
  координата у 

 

 

  объект-прямоугольник