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