मैं इन इंटरफेस घोषणाओं है:मैं कैसे जांचूं कि एक इंटरफेस्ड ऑब्जेक्ट किसी अन्य इंटरफ़ेस को लागू करता है या नहीं?
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;
के लिए जाँच करने
Sysutils.Supports
का उपयोग करना चाहिए http://docwiki.embarcadero.com/Libraries/XE3/en/System.SysUtils.Supports –पर एक नजर है आपका कोड यह जांच नहीं करता है कि क्या IExtendedListener को IListener से विरासत में मिला है, केवल यह कि आईएलस्टनर के माध्यम से संदर्भित उदाहरण भी IxtendedListener का समर्थन करता है। यह दो इंटरफेस के बीच विरासत के बारे में कुछ भी नहीं कहता है। –
'HandleExtendedEvent' को घोषणा में केवल एक तर्क मिला है। आप 2 तर्क क्यों पारित करना चाहते हैं? –