Через интерфейсную переменную у объекта всегда можно запросить интерфейс другого типа. Для этого используется оператор 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.