ВУЗ: Университет управления «ТИСБИ»
Категория: Учебное пособие
Дисциплина: Объектно-ориентированное программирование
Добавлен: 20.10.2018
Просмотров: 1811
Скачиваний: 9
};
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( );
В заключение приведем перечень основных шагов, которые
необходимо выполнить для реализации агрегационного (композиционного)
взаимодействия объектов:
определить возможность и целесообразность применения данного
способа для выявленных объектов
разработать (при необходимости) классы для объектов-частей
разработать класс составных объектов с включением в его структуру
объектных (связующих) свойств
реализовать конструктор(ы) составных классов
реализовать методы составных классов с вызовом (при
необходимости) ранее созданных методов связанных с ними
объектов.
В качестве примера рассмотрим задачу разработки классов для
графических объектов. Решение данной задачи проведем в соответствии с
описанными выше шагами. Целью является использование механизма
агрегации/композиции для построения эффективного набора классов
графических объектов.
Исходные объекты (графические примитивы): Окружность,
Прямоугольник, Отрезок и др.
Анализ объектов:
Окружность: содержит координаты центра и методы доступа к ним
Прямоугольник: содержит координаты базовой точки (например —
левый верхний угол) и методы доступа к ним
Отрезок: содержит координаты одного из концов и методы доступа к ним
Вывод: объекты имеют повторяющиеся данные и методы, которые
целесообразно вынести во вспомогательный класс точек.
Объекты класса «Точка» можно включать как составные части в основные
объекты-примитивы.
В свою очередь, объекты-примитивы можно использовать как части более
сложных составных графических объектов (например, типа
«Деталь»)
Такой подход несомненно является более эффективным по сравнению с
описанием каждого класса «с нуля». Для примера можно сравнить два
описания класса для объекта «Простая деталь», состоящего из
прямоугольника и окружности:
описание «с нуля» потребует введения семи свойств (три для
окружности и четыре для прямоугольника) и (в общем случае) 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( ) {…};
};
Новый (улучшенный) класс окружностей будет реализован уже как
составной и поэтому будет иметь следующие отличия от реализованного «с
нуля»:
вместо двух свойств целого типа с именами 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);
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;