2013-01-15 90 views
7

我有这些接口声明:如何检查接口对象是否实现另一个接口?

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; 
+2

看看http://docwiki.embarcadero.com/Libraries/XE3/en/System.SysUtils.Supports –

+1

你代码不检查IExtendedListener是否继承自IListener,仅仅是通过IListener引用的实例也支持IExtendedListener。它绝不会说任何关于这两个接口之间的继承。 –

+0

'HandleExtendedEvent'在声明中只有一个参数。为什么你想传递2个参数? –

回答

16

您应该使用Sysutils.Supports,检查是否有特殊的接口

uses 
    SysUtils; 

TSomeClass.Notify(AEvent: TMyExtendedEvent); 
var 
    Listener : IListener; 
    ExtListener : IExtendedListener; 
begin 
    for Listener in FListeners do 
    if Supports(Listener, IExtendedListener, ExtListener) then 
     ExtListener.HandleExtendedEvent(AEvent); 
end; 
+0

我正在清理问题的代码,并留下了自我的参考。 –

+0

@劳伦斯巴尔萨蒂好吧,这对我有意义,并不影响问题:o) –

相关问题