【发布时间】:2012-12-29 19:39:09
【问题描述】:
我有这些接口声明:
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;
【问题讨论】:
-
你的代码没有检查IExtendedListener是否继承自IListener,只是说明通过IListener引用的实例也支持IExtendedListener。它绝不会说明两个接口之间的继承。
-
HandleExtendedEvent在声明中只有一个参数。为什么要传递 2 个参数? -
@MarjanVenema,我问这个问题是因为“如果 Listener 是 IExtendedListener 那么”将无法编译。
-
@JeroenWiertPluimers,我相信你错了。我向 TListener 添加了一个 guid,但无法使用
is。不过会很好。