Объектный тип является структурой, состоящей из фиксирован-
ного числа компонентов. Каждый компонент является либо полем, со-
держащим данные строго определенного типа, либо методом, выполня-
ющим операции над объектом. По аналогии с описанием переменных,
описание поля указывает тип данного этого поля и идентификатор,
именующий поле: по аналогии с описанием процедуры или функции,
описание метода указывает заголовок процедуры, функции, конструк-
тора или деструктора.
Объектный тип может наследовать компоненты другого объектно-
го типа. Если T2 наследует от T1, то T2 является потомком T1, а
T1 является родителем T2.
Наследование является транзитивным, то есть если T3 наследу-
ет от T2, а T2 наследует от T1, то T3 наследует от T1. Область
(домен) объектного типа состоит из него самого и из всех его нас-
ледников.
┌──────┐ ┌────────────────┐
тип объекта──>│object├─┬───────────────────>│список компонент├─┐
└──────┘ │ ┌────────────┐ ^ └────────────────┘ │
└─>│Hаследование├─┘ │
└────────────┘ │
┌───────────────────────────────────────────┘
│ ┌───┐
└─┬──────────────────────────────────┬─┤end├>
│ ┌───────┐ ┌────────────────┐ │ └───┘
└──>│private├──>│список компонент├─┘
└───────┘ └────────────────┘
┌───┐ ┌─────────────────────────────┐ ┌───┐
наследование ──>│ ( ├─>│идентификатор объектного типа├─>│ ) ├──>
└───┘ └─────────────────────────────┘ └───┘
список компонент ──┬─────────────────┬───────────────────>
│ ┌────────┐ ^ │ ┌─────────┐ ^
└─>│ список ├──┘ └─>│ список ├──┘
│ полей │ │ методов │
└────────┘ └─────────┘
┌──────────────────────┐ ┌───┐ ┌────┐ ┌───┐
список полей ───>│cписок идентификаторов├─>│ : ├─>│type├>│ ; ├┬>
^ └──────────────────────┘ └───┘ └────┘ └───┘│
│ │
└───────────────────────────────────────────────┘
┌─────────┐ ┌───┐
список методов ──>│заголовок├─┬──────────────────────────┤ ; ├┬─>
^ │ метода │ │ ┌───┐ ┌───────┐ ^└───┘│
│ └─────────┘ └>│ ; ├─>│virtual├┬───────┘ │
│ └───┘ └───────┘│ ^ │
│ │ └────────┐│
│ │ ┌─────────┐││
│ └>│ целая ├┘│
│ │константа│ │
│ └─────────┘ │
└──────────────────────────────────────────────┘
┌────────────────────────┐
заголовок метода ────┬───>│ заголовок процедуры ├──────>
│ └────────────────────────┘ ^
│ ┌────────────────────────┐ │
├───>│ заголовок функции ├──┤
│ └────────────────────────┘ │
│ ┌────────────────────────┐ │
├───>│ заголовок конструктора ├──┤
│ └────────────────────────┘ │
│ ┌────────────────────────┐ │
└───>│ заголовок деструктора ├──┘
└────────────────────────┘
Следующий исходный код приводит пример описания объектного
типа. Далее во всей этой главе на данное описание будут делаться
ссылки.
type
Point = object
X, Y: integer;
end;
Rect = object
A, B: TPoint;
procedure Init(XA, YA, XB, YB: Integer);
procedure Copy(var R: TRectangle);
procedure Move(DX, DY: Integer);
procedure Grow(DX, DY: Integer);
procedure Intersect(var R: TRectangle);
procedure Union(var R: TRectangle);
function Contains(P: Point): Boolean;
end;
StringPtr = ^String;
FieldPtr = ^TField;
TField = object
X, Y, Len: Integer;
Name: StringPtr;
constructor Copy(var F: TField);
constructor Init(FX, FY, FLen: Integer; FName: String);
destructor Done; virtual;
procedure Display; virtual;
procedure Edit; virtual;
function GetStr: String; virtual;
function PutStr(S: String): Boolean; virtual;
end;
StrFieldPtr = ^TStrField;
StrField = object(TField)
Value: PString;
constructor Init(FX, FY, FLen: Integer; FName: String);
destructor Done; virtual;
function GetStr: String; virtual;
function PutStr(S: String): Boolean;
virtual;
function Get: string;
procedure Put(S: String);
end;
NumFieldPtr = ^TNumField;
TNumField = object(TField)
private
Value, Min, Max: Longint;
public
constructor Init(FX, FY, FLen: Integer; FName: String;
FMin, FMax: Longint);
function GetStr: String; virtual;
function PutStr(S: String): Boolean; virtual;
function Get: Longint;
function Put(N: Longint);
end;
ZipFieldPtr = ^TZipField;
ZipField = object(TNumField)
function GetStr: String; virtual;
function PutStr(S: String): Boolean;
virtual;
end;
В отличие от других типов, объектные типы могут описываться
только в разделе описаний типов, находящемся на самом внешнем
уровне области действия программы или модуля. Таким образом, объ-
ектные типы не могут описываться в разделе описаний переменных
или внутри блока процедуры, функции или метода.
Тип компоненты файлового типа не может иметь объектный тип
или любой структурный тип, содержащий компоненты объектного типа.