Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.doc
Скачиваний:
8
Добавлен:
25.12.2018
Размер:
683.01 Кб
Скачать

4.6. Проверка типа

Оператор Is предназначен для проверки совместимости по присвоению экземпляра какого-нибудь класса с заданным классом. Выражение вида:

If AnObject Is TClassType Then TClassType(AnObject).<метод>;

приводит к выполнению <метода> класса TClassType тогда, когда вы­ражение AnObject Is TClassType принимает значение True. А это происходит только в том случае, если объект AnObject совместим по присвоению с клас­сом TClassType, т.е. является экземпляром этого класса или одного из поро­жденных от него классов-потомков.

4.7. Приведение типа

Приведение типа значения (value typecasting) - это операция изменения типа выражения на какой-либо другой. Оба типа - и тип выражения, и ре­зультирующий - должны быть или порядковыми типами, или указателями.

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

With ASomeType As TAnotherType Do...

приводит к тому, что сам экземпляр остается неизменным, однако вызы­ваются те методы, как если бы он принадлежал к присваиваемому типу. Для несовместимых типов эта операция приводит к возбуждению исключения EInvalidCast.

Чаще всего оператор As применяется для выполнения определенных действий над параметром Sender, например, для безопасного приведения па­раметра Sender к конкретному типу:

(Sender As TControl).Visible:=True;

Напомним, что стандартный (неявный) способ приведения типа выгля­дит как:

With TAnotherType(ASoineType) Do...

От стандартного способа приведения типов использование оператора As отличается наличием проверки на совместимость типов во время выполнения операции приведения типа. Очень полезным может быть использование этого оператора в методах-обработчиках событий. Для обеспечения совместимости источник событий Sender имеет тип TObject, хотя ясно, что реально им может быть форма или любые другие компоненты.

Паскалевская форма приведения типа также допустима, но менее надеж­на из-за отсутствия проверки на совместимость типов.

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

4.8. Указатели на класс

Информация в RTTI "живет самостоятельной жизнью" и может исполь­зоваться без создания экземпляра класса. Доступ к RTTI класса вне методов класса можно получить, описав соответствующий указатель, называемый указателем (ссылкой) на класс или указателем на объектный тип (Class reference). Описывается она с помощью зарезервированных слов Class Of Например, указатель на класс TObject описан в модуле System и называется TClass:

Type TObject=Class;

TClass=Class Of TObject;

Известны также указатели TComponentClass, TControlClass и т.п.

Примечания:

Переменные - классовые ссылки не несут в себе информации, содер­жащейся в экземпляре класса, зато содержат информацию о его типе.

Классовая ссылка используется в следующих случаях:

когда не известен тип создаваемого объекта на этапе компиляции;

когда необходим вызов метода класса, чей тип не известен на этапе компиляции:

в качестве правого операнда в операциях проверки и приведения типов (Is и As).

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

Ссылки можно использовать во всех выражениях, где допустимо ис­пользование типа данных. Например, конструкторы, а также классовые процедуры и функции могут вызываться с помощью ссылки на класс.

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

Type

TMyClass=Class(TObject)

. . .

End;

TObjRef=Class Of TObject;