2012-11-23 19 views
11

ओओपी के लिए नया और मैं उलझन में हूं कि सी # में बेस क्लास से विरासत में प्राप्त होने पर व्युत्पन्न-श्रेणी के रचनाकार कैसे काम करते हैं।कन्स्ट्रक्टर पैरामीटर्स और विरासत

पहले आधार वर्ग:

class SubClass : BaseClass 
{ 
    private string SubOutput = null; 

    public SubClass(string BaseString, string SubString) : base(BaseString) 
    { 
     SubOutput = SubString; 
    } 

    public override void PrintLine() 
    { 
     Console.WriteLine(SubOutput); 
    } 
} 

अंत में, कार्यक्रम के मुख्य भाग::

class BaseClass 
{ 
    private string BaseOutput = null; 

    public BaseClass(string BaseString) 
    { 
     BaseOutput = BaseString; 
    } 

    public virtual void PrintLine() 
    { 
     Console.WriteLine(BaseOutput); 
    } 
} 

यहाँ व्युत्पन्न वर्ग है

class Program 
{ 
    static void Main(string[] args) 
    { 
     BaseClass theBase = new BaseClass("Text for BaseClass"); 
     SubClass theSub = new SubClass("2nd param", "Text for SubClass"); 

     theBase.PrintLine(); 
     theSub.PrintLine(); 

     Console.ReadKey(); 
    } 
} 

मुझे नहीं पता क्या इसलिए, व्युत्पन्न कक्षा के लिए कन्स्ट्रक्टर को कॉल करते समय, मुझे बेस क्लास की आवश्यकता वाले पैरामीटर को भी पास करना होगा। व्युत्पन्न कक्षा में बेसऑटपुट फ़ील्ड को बस शून्य पर सेट नहीं करना चाहिए यदि कोई मान निर्दिष्ट नहीं किया गया है? क्यों इस काम की तरह कुछ नहीं कर सकते हैं:

public SubClass(string SubString) : base(BaseString) 

इसके अलावा, जब इस व्युत्पन्न वर्ग में निर्माता बुला, पहले पैरामीटर आधार वर्ग में से एक के रूप में एक ही नाम दिया गया है या फिर यह एक त्रुटि फेंकता है। अगर मैं व्युत्पन्न वर्ग में एक नई स्ट्रिंग चर AnotherString बुलाया परिभाषित करने के लिए थे, क्यों करेंगे यह काम नहीं:

public SubClass(string AnotherString, string SubString) : base(BaseString) 

अंत में, आप इस सही तरीके से करते हैं और यह पता टाइप करते ...

public SubClass(string BaseString, string SubString) : base(BaseString) 

... उप-क्लास कन्स्ट्रक्टर में पहला पैरामीटर क्या है? इसे मेरे व्युत्पन्न वर्ग के लिए किसी भी तरीके से असाइन या इस्तेमाल नहीं किया जा रहा है। मुझे इसे बिल्कुल भी क्यों रखना है?

+0

इसे स्प्लिट सेकेंड के लिए संग्रहीत किया जाता है जब तक आप सबक्लास कंस्ट्रक्टर को कॉल नहीं करते। फिर आप इसे अपने "2 पैरा" पैरामीटर स्ट्रिंग के साथ ओवरराइट करते हैं। –

उत्तर

14

तुम क्यों नहीं कर सकते करने के लिए के रूप में::

public SubClass(string SubString) : base(BaseString) 

आप आधार वर्ग निर्माता के लिए एक स्ट्रिंग गुजर बिना व्युत्पन्न वर्ग का दृष्टांत चाहते हैं, आधार वर्ग एक डिफ़ॉल्ट निर्माता की जरूरत

BaseString क्या होगा?

आप कर सकता है:

public SubClass(string SubString) : base("SomeFixedString") 

या

public SubClass(string SubString) : base(SubString) 

लेकिन अगर आप आधार वर्ग निर्माता के पैरामीटर के लिए एक स्ट्रिंग गुजरती हैं और एक अतिरिक्त एक करना चाहते हैं, तो आप दो स्वीकार करना होगा मापदंडों।

समान नाम रखने के लिए, आप नहीं हैं। आप कर सकते हैं:

public SubClass(string AnotherString, string SubString) : base(AnotherString) 

अंतिम प्रश्न के अनुसार, पहला पैरामीटर कुछ भी नहीं कर रहा है, इसे बेस क्लास कन्स्ट्रक्टर को पास किया जा रहा है। यदि आप चाहें तो आप इसे किसी और चीज़ के लिए इस्तेमाल कर सकते हैं।

+0

यह अब मुझे बहुत अधिक समझ में आता है, धन्यवाद। 'बेस क्लास' को अपने कन्स्ट्रक्टर के माध्यम से जानकारी पारित करने की आवश्यकता होती है और यह उस व्युत्पन्न कन्स्ट्रक्टर में जो भी डालता है उसे खींचती है। – Frank

1

आप डिफ़ॉल्ट मान के साथ BaseString प्रारंभ करना चाहते हैं, तो उस मूल्य आधार के लिए वर्ग निर्माता (इस प्रकार आप व्युत्पन्न वर्ग निर्माता है कि पैरामीटर पारित करने के लिए की जरूरत नहीं है)

public SubClass(string SubString) : base(null) 

पास कर parameterless निर्माता को परिभाषित आधार वर्ग

पैरामीटर नामकरण के बारे में भी - इससे कोई फर्क नहीं पड़ता कि किस नाम में पैरामीटर है, जिसे आप व्युत्पन्न कन्स्ट्रक्टर से गुज़र रहे हैं। एकमात्र चीज जो मायने रखती है वह एक मूल्य है जिसे आप बेस कन्स्ट्रक्टर के पास भेज रहे हैं।

public SubClass(string AnotherString, string SubString) : base(AnotherString) 
1
public SubClass(string BaseString, string SubString) : base(BaseString) 

व्युत्पन्न वर्ग में यह निर्माता का कहना है कि जब आप दो तर्क BaseString और SubString प्राप्त करते हैं, BaseString साथ आधार वर्ग के निर्माता कहते हैं।

इस प्रकार

,

public SubClass(string a, string b) : base(BaseString) 

काम नहीं करता है, क्योंकि आप इसे कह रहे हैं BaseString साथ आधार वर्ग के निर्माता कॉल करने के लिए लेकिन कोई तर्क BaseString कहा जाता है कर रही है।

public BaseClass() { } 
1

आप व्युत्पन्न वर्ग BaseString स्थापित करने के लिए नहीं के लिए अवसर प्रदान करना चाहते हैं, तो आप इस तरह आधार वर्ग में एक डिफ़ॉल्ट निर्माता उपलब्ध कराने की आवश्यकता: व्युत्पन्न वर्ग में अब

public BaseClass() 
{ 

} 

, आप इस तरह आधार वर्ग में कोई तर्क के साथ निर्माता कॉल कर सकते हैं:

public SubClass(string AnotherString) 
    : base() 
{ 
    // base() => explicit call to default construct in the base class. 
    // Do something else 
} 

यह अच्छा सॉफ्टवेयर इंजीनियरिंग अभ्यास प्रदान करता है: अगर तुम आधार वर्ग के स्ट्रिंग सेट करने के लिए अवसर प्रदान करने के लिए नहीं चाहते हैं, तो आधार वर्ग में ऐसा । बेस 'कन्स्ट्रक्टर के लिए तर्क के रूप में नल गुजरने जैसी अन्य' हैक्स 'केवल बेस क्लास के इंटर्नल के साथ टिंकर करने के लिए काम करती हैं जो उप-वर्गों से नहीं की जानी चाहिए।

+0

कुछ अन्य प्रतिक्रियाओं को पढ़ने के बाद मैं निश्चित रूप से एक डिफ़ॉल्ट कन्स्ट्रक्टर रखने का मूल्य देख सकता हूं। मैं डमी मूल्यों को पारित करने के बजाय अब से यह करूँगा, धन्यवाद! – Frank