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;
spojrzeć http://docwiki.embarcadero.com/Libraries/XE3/en/System.SysUtils.Supports –
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. –
'HandleExtendedEvent' ma tylko jeden argument w deklaracji. Dlaczego chcesz przekazać 2 argumenty? –