2009-03-11 7 views
5

मैं इस राशि को जोड़ने के लिए:कैसे एक बेस कक्षा विधि ओवरराइड और मेरे आधार वर्ग में एक पैरामीटर

protected override XmlDocument CreateRequestXML(int somevalue) 
{ 
    ...rest of code 
} 

मैं जानता हूँ कि यह है:

protected abstract XmlDocument CreateRequestXML(); 

मैं अपने व्युत्पन्न वर्ग में से ओवरराइड करने की कोशिश एक आसान सवाल है, लेकिन क्योंकि मैंने एक परम पेश किया है वह मुद्दा है? बात यह है कि कुछ व्युत्पन्न वर्गों के कार्यान्वयन में पैराम हो सकते हैं या नहीं।

उत्तर

11

जब आप वर्चुअल या सार के स्थान पर ओवरराइड शब्द के अपवाद के साथ किसी विधि को ओवरराइड करते हैं, तो मूल विधि के समान सटीक हस्ताक्षर होना चाहिए।

आपने जो किया है वह एक नई असंबंधित विधि बना रहा है। पैरामीटर पेश करना और अभी भी ओवरराइड करना संभव नहीं है।

+0

ठीक है, तो फिर मान लें कि आप यह सुनिश्चित करना चाहते हैं कि प्रत्येक वर्ग को इस विधि को लागू करने के लिए इस बेस क्लास को विरासत में प्राप्त किया जाए। लेकिन आप जानते हैं कि कुछ लोगों में उस विधि के लिए आने वाले कुछ आवश्यक पैराम होंगे और कुछ नहीं। फिर क्या? क्या आपको पैराम की आवश्यकता नहीं है और उन्हें एक निजी क्षेत्र के माध्यम से प्राप्त करें? – user72603

+0

तो, आप उप-वर्गों को संरक्षित विधि को लागू करना चाहते हैं और कुछ उप-वर्गों में जिन्हें आप कभी-कभी पैरा की आवश्यकता होती है क्योंकि उन पर निर्भर करता है और अन्य मामलों में यह नहीं हो सकता है। यदि विधि सार्वजनिक रूप से उपभोग करने के लिए नहीं है तो आप कक्षा के निजी सदस्यों से प्राप्त कर सकते हैं ... क्या यह सामान्य है? – user72603

+1

मैं केवल संरक्षित या यहां तक ​​कि निजी विधि पैरामीटर रहित छोड़ने के लिए सबसे अच्छा (सर्वोत्तम अभ्यास) का पता लगाने की कोशिश कर रहा हूं और इसके बजाय इसे निजी फ़ील्ड से प्राप्त करने की आवश्यकता है – user72603

0

हां पैरामीटर मुद्दा है, विधि हस्ताक्षर बिल्कुल मेल खाना चाहिए (जिसमें वापसी मान और पैरामीटर शामिल हैं)।

2

यदि कुछ व्युत्पन्न कक्षाओं को पैरामीटर की आवश्यकता होती है और कुछ नहीं करते हैं, तो आपको विधि के दो अधिभारित संस्करणों की आवश्यकता होती है। फिर प्रत्येक व्युत्पन्न वर्ग उस व्यक्ति को ओवरराइड कर सकता है जिसकी आवश्यकता है।

class Foo {  
    protected abstract XmlDocument CreateRequestXML(int somevalue); 
    protected abstract XmlDocument CreateRequestXML(); 
}; 

class Bar : public Foo {  
    protected override XmlDocument CreateRequestXML(int somevalue) { ... }; 
    protected override XmlDocument CreateRequestXML() 
     { CreateRequestXML(defaultInt); } 
}; 
निश्चित रूप से

इस उपयोगकर्ता गलत एक फोन करने की एक समस्या प्रस्तुत करता है। यदि अतिरिक्त पैरामीटर के लिए कोई स्वीकार्य डिफ़ॉल्ट नहीं है, तो गलत संस्करण कहलाए जाने पर आपको व्युत्पन्न कक्षा में अपवाद फेंकना पड़ सकता है।

0

मैं बहुत उत्सुक हूं कि आप इस कोड के साथ क्या करने की कोशिश कर रहे हैं।

आम तौर पर जब आप एक उपयोग वर्ग अपने हस्ताक्षर को जानता है तो आप एक अमूर्त कार्य को परिभाषित करते हैं। उपयोग वर्ग में बेस क्लास के साथ "अनुबंध" होता है।

जब आप बेसक्लास से प्राप्त करना चाहते हैं और अतिरिक्त पैरामीटर जोड़ना चाहते हैं, तो उपयोग वर्ग को पता है कि बेस क्लास पर क्या कॉल करना है?

यह एक वास्तुशिल्प दोष की तरह दिखता है .... लेकिन शायद आप आंतरिक विषय में कुछ अतिरिक्त जानकारी जोड़ सकते हैं।

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