Объектные типы
Объектный тип является структурой, состоящей из фиксирован- ного числа компонентов. Каждый компонент является либо полем, со- держащим данные строго определенного типа, либо методом, выполня- ющим операции над объектом. По аналогии с описанием переменных, описание поля указывает тип данного этого поля и идентификатор, именующий поле: по аналогии с описанием процедуры или функции, описание метода указывает заголовок процедуры, функции, конструк- тора или деструктора.
Объектный тип может наследовать компоненты другого объектно- го типа. Если T2 наследует от T1, то T2 является потомком T1, а T1 является родителем T2.
Наследование является транзитивным, то есть если T3 наследу- ет от T2, а T2 наследует от T1, то T3 наследует от T1. Область (домен) объектного типа состоит из него самого и из всех его нас- ледников.
------- ----------------- тип объекта-->¦object+-T------------------->¦список компонент+- L------- ¦ ------------- ^ L----------------- ¦ L->¦Hаследование+-- ¦ L------------- ¦ --------------------------------------------- ¦ ---- L-T----------------------------------T-+end+> ¦ -------- ----------------- ¦ L---- L-->¦private+-->¦список компонент+-- L-------- L-----------------
---- ------------------------------ ---- наследование -->¦ ( +->¦идентификатор объектного типа+->¦ ) +--> L---- L------------------------------ L----
список компонент --T-----------------T-------------------> ¦ --------- ^ ¦ ---------- ^ L->¦ список +--- L->¦ список +--- ¦ полей ¦ ¦ методов ¦ L--------- L----------
----------------------- ---- ----- ---- список полей --->¦cписок идентификаторов+->¦ : +->¦type+>¦ ; +T> ^ L----------------------- L---- L----- L----¦ ¦ ¦ L------------------------------------------------
---------- ---- список методов -->¦заголовок+-T--------------------------+ ; +T-> ^ ¦ метода ¦ ¦ ---- -------- ^L----¦ ¦ L---------- L>¦ ; +->¦virtual+T-------- ¦ ¦ L---- L--------¦ ^ ¦ ¦ ¦ L--------¦ ¦ ¦ ----------¦¦ ¦ L>¦ целая +-¦ ¦ ¦константа¦ ¦ ¦ L---------- ¦ L-----------------------------------------------
Внутренний формат данных объекта имеет сходство с внутренним форматом записи. Поля объекта записываются в порядке их описаний как непрерывная последовательность переменных. Любое поле, унас- ледованное от родительского (порождающего) типа, записывается пе- ред новыми полями, определенными в дочернем (порожденном) типе.
Если объектный тип определяет виртуальные методы, конструк- тор или деструктор, то компилятор размещает в объектном типе до- полнительное поле данных. Это 16-битовое поле, называемое полем таблицы виртуальных методов (VMP), используется для запоминания смещения таблицы виртуальных методов в сегменте данных. Поле таб- лицы виртуальных методов следует непосредственно после обычных полей объектного типа. Если объектный тип наследует виртуальные методы, конструкторы или деструкторы (сборщики мусора), то он также наследует и поле таблицы виртуальных методов, благодаря че- му дополнительное поле таблицы виртуальных методов не выделяется.
Инициализация поля таблицы виртуальных методов экземпляра объекта осуществляется конструктором (или конструкторами) объект- ного типа. Программа никогда не инициализирует поле таблицы вир- туальных методов явно и не имеет к нему доступа.
Следующие примеры иллюстрируют внутренние форматы данных объектных типов.
type PLocation = ^TLocation; TLocation = object X,Y: integer; procedure Init(PX, PY: Integer); function GetX: Integer; function GetY: Integer; end;
PPoint = ^TPoint;
TPoint = object(TLocation) Color: Integer; constructor Init(PX, PY, PColor: Integer); destructor Done; virtual; procedure Show; virtual; procedure Hide; virtual; procedure MoveTo(PX, PY: I+nteger); virtual; end;
PCircle = ^TCircle; TCircle = object(TPoint) Radius: Integer; constructor Init(PX, PY, PColor, PRadius: Integer); procedure Show; virtual;
procedure Hide; virtual; procedure Fill; virtual; end;
Рисунок 21.8 показывает размещение экземпляров типов TLocation, TPoint и TCircle: каждый прямоугольник соответствует одному слову памяти.
TLocation TPoint TCircle ----------- ------------ ------------ ¦ X ¦ ¦ X ¦ ¦ X ¦ +----------+ +-----------+ +-----------+ ¦ Y ¦ ¦ Y ¦ ¦ Y ¦ L----------- +-----------+ +-----------+ ¦ Color ¦ ¦ Color ¦ +-----------+ +-----------+ ¦ VMT ¦ ¦ VMT ¦ L------------ +-----------+ ¦ Radius ¦ L------------
Рис. 21.8 Схема экземпляров типов TLocation, TPoint и TCircle.
Так как TPoint является первым типом в иерархии, который вводит виртуальные методы, то поле таблицы виртуальных методов размещается сразу после поля Color.