Объектные типы данных


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

Объявление и реализация классов

Для объявления классов (объектных типов) используется зарезервированное слово class. Определим некоторый класс графических примитивов TFigure следующим образом:

 

TFigure = class

fColor: Byte;

fThickness: Byte;

fCanvas: TCanvas;

procedure SetColor(Value: Byte);

procedure SetThickness(Value: Byte);

procedure PrepareCanvas;

end;

 

По принятому соглашению имена классов начинаются с заглавной буквы «T», имена полей данных начинаются с буквы «F», и поля класса объявляются до методов. Класс объединяет данные, представленные атрибутами(полями) и алгоритмы (методы) по их обработке.

В примере к полям данных класса относятся: поле fColor, хранящее код цвета, поле fThickness, задающее толщину линий и поле fCanvas, представляющее полотно, на котором будет происходить отображение графических примитивов.

Методы класса определяют действия, выполняемые над данными. Их совокупность характеризует функциональный аспект поведения класса. Методы представляют собой процедуры и функции, принадлежащие классу. К методам класса относится метод PrepareCanvas, выполняющий подготовку полотна к работе и два метода задания значений полей данных – SetColor и SetThickness.

Таким образом, в одной информационной структуре TFigure оказались объединены как исходные параметры, так и необходимые средства по выполнению их реализации. Такое объединение (сокрытие) данных и методов в качестве собственных ресурсов класса получило название инкапсуляции.

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

 

unit figures;

 

Interface

 

Type

TFigure = class

fColor: Byte;

fThickness: Byte;

fCanvas: TCanvas;

procedure SetColor(Value: Byte);

procedure SetThickness(Value: Byte);

procedure PrepareCanvas;

end;

 

 

Implementation

 

procedure TFigure.SetColor(Value: Byte);

Begin

if fColor <> Value then

fColor:=Color;

end;

 

procedure TFigure.SetThickness(Value: Byte);

Begin

if fThickness <> Value then

fThickness:=Value;

end;

 

procedure TFigure.PrepareCanvas;

Begin

{ Подготовка полотна для рисования }

end;

 

end.

 

Методы SetColor и SetThickness выполняют присвоение внутреннему полю fColor и fThickness значения в том случае, если текущее значение отличается от передаваемого. К полям класса никогда не следует обращаться напрямую, а только посредством специальных методов, обеспечивающих корректность выполнения операции присваивания.

Теперь объявим переменную f класса TFigure:

 

Var

f: TFigure;

 

Переменную f называют экземпляром класса, объектной ссылкой или просто объектом. Через объект f возможен доступ к методам и полям класса. Однако для начала необходимо создать сам объект. Для этого необходимо вызвать специальную процедуру Create, называемую конструктором:

 

f:=TFigure.Create;

 

Конструктор не объявлен в классе TFigure, однако присутствует в нем от класса TObject благодаря специальному механизму наследования классов друг от друга. В результате будет выделена область памяти в размере, необходимом для хранения объекта f. Обратите внимание, конструктор вызывается с помощью ссылки на тип, а не на экземпляр типа, в отличие от методов, которые всегда вызываются с помощью ссылки на экземпляр. Связано это с тем, что объект f на момент вызова конструктора еще не создан.

После создания объекта с ним можно работать:

 

uses figures;

 

Var

f: TCircle;

 

Begin

f:=TCircle.Create;

f.SetColor($FF);

f.SetThickness(1);

f.PrepareCanvas;

f.Free;

end.

 

После выполнения методов объект f следует удалить, чтобы он не занимал места в памяти. Удаление выполняет метод Destroy, определенный в классе TObject (базовом классе), но лучше использовать Free, т.к. он инкапсулирует вызов Destroy: в начале определяется, существует ли объект и только затем выполняется вызов Destroy. В противном случае метод Free ничего не делает.

Класс Figure можно модифицировать, например, явно добавить к методам конструктор Create с помощью зарезервированного слова constructor и деструктор Destroy с помощью зарезервированного слова destructor:

 

TFigure = class

...

constructor Create;

destructor Destroy;

end;

 

В конструкторе присваиваются полям начальные значения и создается объект полотна:

 

constructor TFigure.Create;

Begin

fColor:=$FF;

fThickness:=1;

fCanvas:=TCanvas.Create;

end;

 

В деструктореобычно выполняются действия, связанные с освобождением задействованных в течение работы объекта ресурсов:

 

destructor TFigure.Destroy;

Begin

{ Освобождение ресурсов, используемых в работе объекта }

fCanvas.Free;

end;



Дата добавления: 2021-12-14; просмотров: 255;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.012 сек.