12.8.7 Операторы действий над классами

Вверх  Предыдущий  Следующий

Операторы действий с классами немного отличаются от операторов перечисленных выше, в том смысле, что они могут быть использованы только выражениях с классами. Есть только два оператора действий над классами, что можно видеть в таблице (12.8).


Таблица 12.8: Операторы действий над Классами

Оператор

Действие

is

Проверки типа класса

as

Приведение типов


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

Object is Class

Это выражение полностью эквивалентно

Object.InheritsFrom(Class)

Если Object является Nil, будут возвращено False.

Ниже приведен пример:

Var

A : TObject;

B : TClass;

begin

if A is TComponent then ;

If A is B then;

end;

Как оператор as выполняет приведение типа. Результат этого выражения, имеет тип класса:

Object as Class

Это эквивалентно следующему:

If Object=Nil then

  Result:=Nil

else if Object is Class then

  Result:=Class(Object)

else

  Raise Exception.Create(SErrInvalidTypeCast);

Обратите внимание , что если объект равен nil, то, оператор as не генерирует исключение.

Ниже приведены некоторые примеры использования as оператора:

Var

C : TComponent;

O : TObject;

begin

(C as TEdit).Text:=’Some text’;

C:=O as TComponent;

end;

В качестве операторов as и is также работают на COM - интерфейсы.

Они могут быть использованы для проверки реализует ли интерфейс, применение is и as показано в следующем примере:

{$mode objfpc}

 

uses

SysUtils;

 

type

IMyInterface1 = interface

  [’{DD70E7BB-51E8-45C3-8CE8-5F5188E19255}’]

  procedure Bar;

end;

 

IMyInterface2 = interface

  [’{7E5B86C4-4BC5-40E6-A0DF-D27DBF77BCA0}’]

  procedure Foo;

end;

 

TMyObject = class(TInterfacedObject, IMyInterface1, IMyInterface2)

  procedure Bar;

  procedure Foo;

end;

 

procedure TMyObject.Bar;

begin

 

end;

 

procedure TMyObject.Foo;

begin

 

end;

 

var

i: IMyInterface1;

begin

i := TMyObject.Create;

i.Bar;

Writeln(BoolToStr(i is IMyInterface2, True)); // Напечатает true

Writeln(BoolToStr(i is IDispatch, True)); // Напечатает false

(i as IMyInterface2).Foo;

end.

Кроме того, оператор is может быть использован для проверки, что класс реализует интерфейс, а оператор as приводит пременную типа интерфейс обратно к классу:

{$mode objfpc}

var

i: IMyInterface;

begin

i := TMyObject.Create;

Writeln(BoolToStr(i is TMyObject,True)); // Напечатает true

Writeln(BoolToStr(i is TObject,True)); // Напечатает true

Writeln(BoolToStr(i is TAggregatedObject,True)); // Напечатает false

(i as TMyObject).Foo;

end.

Хотя интерфейсы должны быть COM-интерфейсами, но приведённый обратно к классу будет работать только, если интерфейс наследуется от класса Object Pascal. Он не будет работать для интерфейсов, полученных из системы с помощью COM.