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