В Object Pascal после компиляции программы для любого класса сохраняется некая дополнительная информация, которая размещается в памяти непосредственно перед VMT. Эта информация называется информацией о типе периода времени выполнения (run-time type information, RTTI). Как было сказано выше, любой объект кроме данных полей содержит указатель на VMT (возможно на пустую таблицу, если у класса и его предков нет виртуальных методов). Следовательно, во время работы программы любой объект может получить доступ к RTTI своего класса. Схема размещения объектов и класса в памяти показана на рис. 1.
Рис. 1. Схема размещения объектов и RTTI в памяти
Известно, что в RTTI в числе прочих содержатся следующие данные:
1. Указатель на VMT класса-предка;
2. Указатель на строку с именем класса;
3. Размер экземпляра объекта в байтах.
Эти данные позволяют во время выполнения программы контролировать (type checking) и приводить (type casting) объектные типы.
Для контроля типов используется оператор is. Выражение объект is класс возвращает true, если объект принадлежит указанному классу или потомкам этого класса:
if Man is TPerson then . . .
Для приведения типов используется оператор as в следующей форме:
(Man as TPerson).SetAge(37);
Допустима традиционная конструкция приведения типов в виде TPerson(Man).SetAge(37), однако оператор as является более безопасным. В случае неудачи (то есть, когда объект не относится к указанному классу или его потомкам) он генерирует обрабатываемую исключительную ситуацию, а жёсткое приведение типов может привести к краху приложения.
Литература
1. Архангельский, А. Delphi 2006. Справочное пособие. Язык Delphi, классы, функции Win32 и .NET / А. Я. Архангельский; – СПб. : Бином-Пресс, 2009. – 1152 с. : ил.
2. Кэнту, М. Delphi 2005. Для профессионалов / Марко Кэнту ; пер. с англ. – СПб. : Питер, 2007. – 912 с. : ил.
3. Calvert, Ch. Object Pascal Style Guide / Charles Calvert [Электронный ресурс]. Режим доступа : http://edn.embarcadero.com/article/10280.
[1] Для имён полей в Object Pascal традиционно используется префикс «f» (field – поле).
[2] Термин специфичен для Object Pascal, в котором статические методы противопоставляются виртуальным. В других языках программирования под статическим методом обычно понимают методы, работающие с классом, а не объектом.