12.8.7 Операторы действий над классами |
Вверх Предыдущий Следующий |
Операторы действий с классами немного отличаются от операторов перечисленных выше, в том смысле, что они могут быть использованы только выражениях с классами. Есть только два оператора действий над классами, что можно видеть в таблице (12.8). Таблица 12.8: Операторы действий над Классами
Выражение, содержащий оператор 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. |