2013-01-15 29 views
7

मैं इन इंटरफेस घोषणाओं है:मैं कैसे जांचूं कि एक इंटरफेस्ड ऑब्जेक्ट किसी अन्य इंटरफ़ेस को लागू करता है या नहीं?

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; 
+2

के लिए जाँच करने Sysutils.Supports का उपयोग करना चाहिए http://docwiki.embarcadero.com/Libraries/XE3/en/System.SysUtils.Supports –

+1

पर एक नजर है आपका कोड यह जांच नहीं करता है कि क्या IExtendedListener को IListener से विरासत में मिला है, केवल यह कि आईएलस्टनर के माध्यम से संदर्भित उदाहरण भी IxtendedListener का समर्थन करता है। यह दो इंटरफेस के बीच विरासत के बारे में कुछ भी नहीं कहता है। –

+0

'HandleExtendedEvent' को घोषणा में केवल एक तर्क मिला है। आप 2 तर्क क्यों पारित करना चाहते हैं? –

उत्तर

16

आप एक विशेष इंटरफ़ेस

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

मैं प्रश्न के लिए कोड साफ़ कर रहा था और स्वयं को संदर्भ में छोड़ दिया। –

+0

@LawrenceBarsanti ठीक है, जो मुझे समझ में आता है और सवाल को प्रभावित नहीं करता है: ओ) –

संबंधित मुद्दे

 संबंधित मुद्दे