2013-01-15 13 views
7

mam te deklaracje interfejs:Jak sprawdzić, czy obiekt z interfejsem implementuje inny interfejs?

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

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

Biorąc pod uwagę odniesienie do czegoś interfejs, który implementuje IListener, w jaki sposób mogę sprawdzić, czy to także realizuje IExtendedListener? Używam kodu poniżej kodu, ponieważ jest to błąd kompilacji czasu, aby zrobić coś jak 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

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

+1

Twój kod nie sprawdza, czy IExtendedListener dziedziczy z IListener, tylko że instancja odwoływana przez IListener obsługuje również IExtendedListener. W żaden sposób nie mówi nic o dziedziczeniu między tymi dwoma interfejsami. –

+0

'HandleExtendedEvent' ma tylko jeden argument w deklaracji. Dlaczego chcesz przekazać 2 argumenty? –

Odpowiedz

16

Należy użyć Sysutils.Supports aby sprawdzić specjalny interfejs

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

Sprzątałem kod dla pytania i zostawiłem odniesienie do siebie. –

+0

@ LawrenceBarsanti ok, to ma sens dla mnie i nie wpłynęło na pytanie: o) –

Powiązane problemy