我有这些接口声明:如何检查接口对象是否实现另一个接口?
IListener = interface
procedure HandleEvent(AEvent: TMyEvent);
end;
IExtendedListener = interface(IListener)
['{85A3456A-D5E5-4F37-ABDD-A75A7B3B494C}'] // required by GetInterface
procedure HandleExtendedEvent(AExtendedEvent: TMyExtendedEvent);
end;
考虑的东西,实现IListener
接口引用,我怎么能检查是否还实现IExtendedListener
?我正在使用下面的代码代码,因为编译时错误做了类似if Listener is IExtendedListener then ...
。
TSomeClass.Notify(AEvent: TMyExtendedEvent);
var
Listener: IListener;
ExtListener: IExtendedListener;
Obj: TObject;
begin
for Listener in FListeners do
begin
// works but smells funny
Obj := Listener as TObject;
Obj.GetInterface(IExtendedListener, ExtListener);
if Assigned(ExtListener) then
ExtNotifyee.HandleExtendedEvent(AEvent);
end;
end;
看看http://docwiki.embarcadero.com/Libraries/XE3/en/System.SysUtils.Supports –
你代码不检查IExtendedListener是否继承自IListener,仅仅是通过IListener引用的实例也支持IExtendedListener。它绝不会说任何关于这两个接口之间的继承。 –
'HandleExtendedEvent'在声明中只有一个参数。为什么你想传递2个参数? –