Внутренняя структура объекта Obj2

Указатель на объект

Obj2 IУказатель на класс

TSecondClass

Поле FMyFieldi

Поле FMyField2

Информация класса

TSecondClass

Адрес метода

TSecondClass.VirtMethodi

Адрес метода

TSecondClass.VirtMethod2

Число динамических

методов: 1

Индекс метода

TSecondClass.DynaMethodi

Адрес метода

TSecondClass. DynaMethod 1

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

AnObject is TObjectType принимает значение True, только если объект AnObject совместим по присваиванию с классом TObjectType, т. е. является объектом этого класса или одного из классов, порожденных от него. Кстати, определенная проверка происходит еще при компиляции: если формально объект и класс несовместимы, то компилятор выдаст ошибку в этом операторе.

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

with ASomeObject as TAnotherType do...

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

Очень полезным может быть оператор as в методах-обработчиках событий. Для обеспечения совместимости в 99% случаев источник события sender имеет тип TObject, хотя в тех же 99% случаев им является форма или другие компоненты. Поэтому, чтобы иметь возможность пользоваться их свойствами, применяют оператор as:

(Sender as TControl).Caption := "Thanks!";

Вся информация, описывающая класс, создается и размещается в памяти на этапе компиляции. Возникает резонный вопрос: а нельзя ли получить доступ к ней, не создавая экземпляр объекта? Да, можно. Доступ к информации класса вне методов этого классаможно получить, описав соответствующий указатель, который называется указателем на класс, или указателемна объектный тип (class reference). Он описывается при помощи зарезервированных слов class of. Например, указатель на класс TObject описан в модуле SYSTEM.PAS и называется TCiass:

type

TObject = class;

TCiass = class of TObject;

Аналогичные указатели уже описаны и для других важных классов. Вы можете использовать в своей программе TComponentClass, TControlClass и т. п.

Указатели на классы тоже подчиняются правилам приведения объектных типов. Указатель на класс-предок может ссылаться и на любые дочерние классы; обратное невозможно:

type

TFirst = class

end;

TSecond = class(TFirst)

end;

TFirstClass = class of TFirst;

TSecondClass = class of TSecond;

var

AFirst : TFirstClass;

ASecond : TSecondClass;

begin

AFirst := TSecond; {допустимо}

ASecond := TFirst; (недопустимо}

end.

С указателем на класс тесно связано понятие методов класса. Такие методы можно вызывать без создания экземпляра объекта — с указанием имени класса, в котором они описаны. Перед описанием метода класса нужно поставить зарезервированное слово class:

type

TMyObj ect= class(TObject)

class function GetSize: string

end;

var

MyObject:

AString:

begin

AString :

MyObj ect

AString :

end.

TMyObject;

string;

= TMyObject.GetSize;

:= TMyObject.Create;

= MyObject.GetSize;

Разумеется, методы класса не могут использовать значения, содержащиеся в полях класса: ведь экземпляра-то не существует. Возникает вопрос: для чего нужны такие методы? Важнейшие методы класса определены в самом TObject: они как раз и позволяют, не углубляясь во внутреннюю структуру класса, извлечь оттуда практически всю необходимую информацию.