Использование оператора as
Использование оператора as
Объекты, поддерживающие интерфейсы, могут использовать оператор as для динамического присоединения интерфейса. Например,
procedurePaintObjects(P: TInterfacedObject) var
X: IPaint; begin
X := P as IPaint; {операторы} end;
В данном примере переменная Р имеет тип TInterfacedObject. Данная переменная может быть назначена переменной X, как ссылка на интерфейс IPaint. Для данного назначения компилятор генерирует код для вызова метода QueryIntetface, относящегося к интерфейсу IUnknown переменной P. Такое назначение возможно, даже если Р не поддерживает данный интерфейс. То есть компилятор не выдаст ошибку при таком назначении.
Во время выполнения вышеприведенного примера либо успешно происходит присваивание
Х:= Р as IPaint;
либо генерируется исключительная ситуация.
При использовании оператора as вы должны выполнять следующие требования:
- при объявлении интерфейса явно объявляйте в качестве предка интерфейс Iunknown, т. к. только в этом случае вы сможете воспользоваться оператором as;
- если вы используете оператор as для интерфейса, данный интерфейс должен иметь свой IID. Напомним, что для создания нового IID достаточно, находясь в редакторе кода, нажать комбинацию клавиш <Ctrl>+ +<Shift>+<G>.