Получение интерфейса через другой интерфейс

Через интерфейсную переменную у объекта всегда можно запросить интерфейс другого типа. Для этого используется оператор as, например:

var
  Intf: IInterface;
begin
  ...
  with Intf as ITextReader do
    Active := True;
  ...
end;

Если объект действительно поддерживает запрашиваемый интерфейс, то результатом является ссылка соответствующего типа. Если же объект не поддерживает интерфейс, то возникает исключительная ситуация EIntfCastError.

В действительности оператор as преобразуется компилятором в вызов метода QueryInterface:

var
  Intf: IInterface;
  IntfReader: ITextReader;
...
  IntfReader := Intf as ITextReader; // Intf.QueryInterface
                                     //(ITextReader, IntfReader);

Напомним, что метод QueryInterface описан в интерфейсе IInterface и попадает автоматически во все интерфейсы. Стандартная реализация этого метода находится в классе TInterfacedObject.

 

Яндекс цитирования