2015-01-13 5 views
5

मैं विशिष्ट इंटरफेस की सूची प्राप्त करने के लिए इंटरफेस की एक कस्टम सूची घोषित करने की कोशिश कर रहा हूं, जिसमें मैं विशिष्ट इंटरफेस की सूची प्राप्त करने के लिए वारिस करना चाहता हूं (मुझे IInterfaceList से अवगत है, यह सिर्फ एक उदाहरण है)। मैं डेल्फी 2007 का उपयोग कर रहा हूं इसलिए मुझे वास्तविक जेनेरिक तक पहुंच नहीं है (मुझे करुणा है)।मैं दो इंटरफेस को कैसे कार्यान्वित कर सकता हूं जिसमें समान नाम वाले विधियां हों?

ICustomInterfaceList = interface 
     procedure Add(AInterface: IInterface); 
     function GetFirst: IInterface; 
    end; 

    TCustomInterfaceList = class(TInterfacedObject, ICustomInterfaceList) 
    public 
     procedure Add(AInterface: IInterface); 
     function GetFirst: IInterface; 
    end; 

    ISpecificInterface = interface(IInterface) 
    end; 

    ISpecificInterfaceList = interface(ICustomInterfaceList) 
     function GetFirst: ISpecificInterface; 
    end; 

    TSpecificInterfaceList = class(TCustomInterfaceList, ISpecificInterfaceList) 
    public 
     function GetFirst: ISpecificInterface; 
    end; 

TSpecificInterfaceList संकलन नहीं होगा:

E2211 'GetFirst' अलग है की घोषणा घोषणा से इंटरफ़ेस में 'ISpecificInterfaceList'

मुझे लगता है कि

यहाँ एक सरल उदाहरण है मैं सैद्धांतिक रूप से TCustomInterfaceList का उपयोग कर सकता हूं लेकिन जब भी मैं इसका उपयोग करता हूं तो मैं "गेटफास्ट" नहीं डालना चाहता हूं। मेरा लक्ष्य एक विशिष्ट वर्ग होना है जो दोनों को बेस क्लास का व्यवहार प्राप्त होता है और "गेटफास्ट" लपेटता है।

मैं इसे कैसे प्राप्त कर सकता हूं?

धन्यवाद!

+2

संभावित डुप्लिकेट [विभिन्न विधि नामों के लिए इंटरफेस नामों को कैसे मैप करें?] (Http://stackoverflow.com/questions/1390552/how-to-map-interface-names-to-different-method-names) – RFerwerda

उत्तर

5

ISpecificInterfaceList तीन विधियों को परिभाषित करता है। वे हैं:

procedure Add(AInterface: IInterface); 
function GetFirst: IInterface; 
function GetFirst: ISpecificInterface; 

क्योंकि आपके दो कार्य एक ही नाम साझा करते हैं, आपको संकलक की पहचान करने की आवश्यकता है कि कौन सा है।

method resolution clause का उपयोग करें।

TSpecificInterfaceList = class(TCustomInterfaceList, ISpecificInterfaceList) 
public 
    function GetFirstSpecific: ISpecificInterface; 
    function ISpecificInterfaceList.GetFirst = GetFirstSpecific; 
end; 
+0

बहुत बढ़िया! धन्यवाद :) –

1

यह सुनिश्चित नहीं है कि यह डेल्फी 7 में भी संभव है, लेकिन आप अपनी घोषणा में विधि समाधान खंडों का उपयोग करने का प्रयास कर सकते हैं।

function interface.interfaceMethod = implementingMethod; 

यदि संभव हो, तो यह नामकरण विवादों को हल करने में आपकी सहायता करेगा।

0

पैरामीटर अलग होने पर विधियों के लिए आप ओवरराइड भी चुन सकते हैं।

इंटरफ़ेस फ़ंक्शन मैपिंग शांत है यदि आप बाद में वंशज हैं जो अवरोधक इंटरफ़ेस को कार्यान्वित करते हैं क्योंकि इन कार्यों को अगली कक्षा में इंटरफ़ेस विधि के रूप में अग्रेषित नहीं किया जाता है और इसलिए आपको उन्हें रीमेप करने की आवश्यकता होती है।

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

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