Объектный тип является наиболее абстрактным и мощным из структурных типов. Он содержит в себе не только данные (поля объекта), но и средства их обработки (методы объекта), то есть, если рассматривать его с алгебраических позиций, представляет собой множество с определенными на нем операциями. Это свойство объектов называется инкапсуляцией. Объекты могут наследовать поля и методы друг друга, добавляя при этом свои собственные. Данное свойство называется наследованием. И, наконец, объекты-потомки могут переопределять методы предков, полностью или частично изменяя тем самым реакцию объектов-предков на различные события. Такое поведение называется полиморфизмом.

Объектный тип ::=

"object" ["("объект_предок")"]

{["private" | "public"]}

поля_объекта

заголовки_методов_объектов

"end".

Методы объектов могут быть статическими и виртуальными процедурами и функциями. Виртуальная процедура или функция может быть переопределена внутри объекта-потомка в рамках полиморфизма (допускается также переопределение статической процедуры или функции, однако свойства объекта-предка при этом не изменяются).

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

Пример:

type

Point=object

{поля объекта}

x, y : integer;

{заголовки методов объекта}

constructor Init(new, NewY:integer);

destructor Done; virtual;

procedure SetXY(new, NewY:integer);

{скрытые поля и заголовки методов объекта}

private

OldX,OldY:integer;

Procedure ClearXY;

end;

TCircle= object(point) {наследование от point}

{поля объекта}

R : integer;

{заголовки методов объекта}

constructor Init(new, NewY, NewR:integer);

procedure SetRadius(NewR:integer);

{скрытые поля и заголовки методов объекта}

private

OldR: integer;

Procedure ClearR;

end;

В разделе объявления процедур и функций все методы объекта должны быть определены.

Например:

constructor TCircle.Init(new, NewY, NewR:integer);

begin

inherited Nit(new, NewY); {вызов метода предка}

R:=NewR;

end;

Определение переменных объектного типа и обращение к ним происходит аналогично записям (то есть с помощью символа "." или оператора With).

Пример:

var S:Tpoint;

begin

s.Init(10,20);

with s do begin

SetXY(x*10,y*10);

end;

s.done;

end.


<- Предыдущая страница | Следующая страница ->

Последнее изменение: Вторник 1 Март 2011, 17:20