type

TFirstClass = class

FMyFieldl: Integer;
FMyFielcE: Longint;
procedure StatMethcd;
procedure VirtMethodl;
virtual;
procedure VirtMethocB;
virtual;
procedure DynaMethodl;
dynamic-procedure DynaMethofE;
dynamic-end;

TSecondClass = class(TMyObject)

procedure StatMethcd;
procedure VirtMethodl;
override;
procedure B/naMethodl;
override;
end;
Objl: TFirstClass;
Ob j 2: TSecondClass ;

На рис. 1.1 показано, как будет выглядеть внутренняя структура рассмотренных в нем объектов.

Первое поле каждого экземпляра того или иного объекта содержит указатель на его класс. Класс как структура состоит из двух частей. Начиная с адреса, на который ссылается указатель на класс, располагается таблица виртуальных методов. Напомним, что она содержит адреса всех виртуальных методов класса, включая унаследованные от предков. Длина таблиц VMT объектов Objl и 0bj2 одинакова- по два элемента (8 байт). Перед таблицей виртуальных методов расположена специальная структура, содержащая дополнительную служебную информацию. В ней содержатся данные, полностью характеризующие класс: его имя, размер экземпляра, указатели на класс-предок, имя класса и т. д. На рис. 1.1 она показана одним блоком, а ее содержимое расшифровано ниже.

Одно из полей структуры содержит адрес таблицы динамических методов класса (DMT). Таблица имеет следующий формат - в начале слово, содержащее количество элементов таблицы; затем - слова, соответствующие индексам методов. Нумерация индексов начинается с -1 и идет по убывающей. После индексов идут собственно адреса динамических методов. Обратите внимание, что DMT объекта Ob j 1 состоит из двух элементов, ob j 2 - из одного, соответствующего перекрытому методу DynaMethodl. В случае вызова Obj2, DynaMethod2 индекс не будет найден в таблице DMT 0bj2, и произойдет обращение к DMT objl. Именно так экономится память при использовании динамических методов.

В языке Object Pascal определены два оператора - is и as, неявно обращающиеся к таблице динамических методов. Оператор is предназначен для проверки совместимости по присваиванию экземпляра объекта с заданным классом.

Внутренняя структура объекта ОЬ\Л

Программирование в Delphi 7

Рис. 1.1. Внутренняя структура объектов Objln Obj2

Выражение вида:

МЗэзесй; ±з тсь^ееетуре принимает значение Тгае, только если объект АпСЛдест совместим по присваиванию с классом ТОЪдестТуре, т. е. является объектом этого класса или одного из классов, порожденных от него. Кстати, определенная проверка происходит еще при компиляции: если формально объект и класс несовместимы, то компилятор выдаст ошибку в этом операторе.

Оператор as введен в язык специально для приведения объектных типов. С его помощью можно рассматривать экземпляр объекта как принадлежащий к другому совместимому типу:

withASomeObject as TAnotherT^/pe do. . .

От стандартного способа приведения типов с помощью конструкции TAnotherType (ASomeOb j ect) использование оператора as отличается наличием проверки на совместимость типов во время выполнения (как в операторе is): попытка приведения к несовместимому типу приводит к возникновению исключительной ситуации EinvalidCast (см. гл. 4). После применения оператора as сам объект остается неизменным, но вызываются те его методы, которые соответствуют присваиваемому классу.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Октябрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс