2013-01-15 15 views
7

Ho questi dichiarazioni di interfaccia:Come posso verificare se un oggetto interfacciato implementa un'altra interfaccia?

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

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

Dato un riferimento un'interfaccia per qualcosa che implementa IListener, come posso verificare se implementa anche IExtendedListener? Sto usando il codice sotto il codice perché è un errore in fase di compilazione per fare qualcosa come 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

dare un'occhiata a http://docwiki.embarcadero.com/Libraries/XE3/en/System.SysUtils.Supports –

+1

tuo il codice non controlla se IExtendedListener eredita da IListener, ma semplicemente che l'istanza referenziata tramite IListener supporta anche IExtendedListener. In nessun modo dice nulla sull'eredità tra le due interfacce. –

+0

'HandleExtendedEvent' ha solo un argomento nella dichiarazione. Perché vuoi passare 2 argomenti? –

risposta

16

Si dovrebbe usare Sysutils.Supports per verificare la presenza di una speciale interfaccia

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

Stavo pulendo il codice per la domanda e ho lasciato il riferimento al self in. –

+0

@LawrenceBarsanti ok, questo ha senso per me e non ha influito sulla domanda: o) –

Problemi correlati