如何检查接口对象是否实现另一个接口?

Law*_*nti 8 delphi oop interface

我有这些接口声明:

IListener = interface
  procedure HandleEvent(AEvent: TMyEvent);
end;

IExtendedListener = interface(IListener)
  ['{85A3456A-D5E5-4F37-ABDD-A75A7B3B494C}']  // required by GetInterface
  procedure HandleExtendedEvent(AExtendedEvent: TMyExtendedEvent);
end;
Run Code Online (Sandbox Code Playgroud)

给定实现的东西的接口引用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;
Run Code Online (Sandbox Code Playgroud)

Sir*_*ufo 19

您应该使用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;
Run Code Online (Sandbox Code Playgroud)