2011-06-16 19 views
15

शीर्षक भ्रमित लग सकता है। मैं चाहता हूं कि एक ही वर्ग के कन्स्ट्रक्टर और एक कन्स्ट्रक्टर के अंदर बेस क्लास के कन्स्ट्रक्टर को कॉल करना है। हो सकता है कि मेरी पहली हल करने के लिए है कि मेरे सवाल समझा जा सकता है प्रयास:कन्स्ट्रक्टर में कॉल बेस कन्स्ट्रक्टर और अन्य कन्स्ट्रक्टर

public MyClass(MyClass obj) : base(obj),this() {} 

लेकिन उस अंकन काम नहीं कर रहा। क्या इसे हल करने के लिए कोई समाधान है?

+2

क्या होगा यदि आपके पैरामीटर रहित कन्स्ट्रक्टर ('यह()') ने एक अलग बेस क्लास कन्स्ट्रक्टर निर्दिष्ट किया है (जो यह स्पष्ट रूप से करता है - पैरामीटर रहित - अगर निर्दिष्ट नहीं है)।किस बेस क्लास कन्स्ट्रक्टर को बुलाया जाना चाहिए? –

उत्तर

12

नहीं है, आप निम्न कारणों से यह नहीं कर सकते:

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

1

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

+0

आपकी पोस्ट के लिए धन्यवाद। हां, यह एक समाधान है जिसे मैंने माना। लेकिन मुझे उम्मीद है कि एक कन्स्ट्रक्टर में बेस() और यह() को कॉल करने जैसे समाधान हो सकते हैं, जैसे कि यह संभव है। जावा। – Kai

2

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

+0

एक कन्स्ट्रक्टर में वर्चुअल विधियों को कॉल करना आम तौर पर अच्छी शैली नहीं है। – leppie

+0

क्या आपका मतलब है "बेस-क्लास कॉल कुछ करें", या "बेस-कॉल कुछ करें"? साथ ही, बेस-क्लास के अंदर वर्चुअल फ़ंक्शन को ओवरराइड क्यों करना चाहिए? उप-वर्गों में आभासी कार्यों को ओवरराइड किया जाना है। –

+0

वर्चुअल विधि को कॉल करना इसे हल करने का एक अच्छा तरीका नहीं है। देखें: http://blogs.msdn.com/b/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx और एरिक की टिप्पणी 18 फरवरी 2008 6:50 अपराह्न – thekip

0

सी # में आप भी प्रत्येक सदस्य के लिए घोषणा में एक डिफ़ॉल्ट प्रारंभ उपलब्ध करा सकता है:

private int foo_ = 41; 

यह कई उपयोग-अन्य-निर्माता मुद्दों के लिए हल करती है।

2

एक तरीका बनाना होगा base(obj) पर कॉल करने के लिए MyClass का पैरामीटर रहित कन्स्ट्रक्टर। लेकिन यदि आप हमेशा ऐसा नहीं करना चाहते हैं, तो मुझे नहीं लगता कि एक अच्छा तरीका है।

शायद आप उन रचनाकारों में सामान को स्थानांतरित करने का प्रयास कर सकते हैं। क्या आप इन रचनाकारों में वास्तव में क्या होता है इसके बारे में अधिक जानकारी पोस्ट कर सकते हैं?

+0

पर यह प्रतिलिपि बनाने वाले निर्माताओं के लिए है। ताकि मैं पैरामीटर रहित कन्स्ट्रक्टर की "डिफ़ॉल्ट सामग्री" कह सकूं और बेस कन्स्ट्रक्टर को कॉल कर सकता हूं। – Kai

+0

क्या आप आधार में पैरामीटर रहित कन्स्ट्रक्टर की "डिफ़ॉल्ट सामग्री" नहीं डाल सकते हैं? या बस इसे अन्य कन्स्ट्रक्टर में कॉपी करें? –

5

सी # या तो आधार (...) या यह (...) की अनुमति देता है, क्योंकि प्रत्येक निर्माता को अंततः एक सुपर कन्स्ट्रक्टर का आह्वान करना चाहिए। तो यदि आधार() और यह() दोनों को आमंत्रित करना संभव था, तो दो सुपर कन्स्ट्रक्टरों का आविष्कार होगा, जो मूल रूप से गलत होगा।

यही कारण है कि बेस (...) को दो बार आमंत्रित करना संभव नहीं है।

public class Person 
{ 
    public Person(int age) { 
     this.Age = age; 
    } 
    public int Age; 
} 

public class students :Person 
{ 
    public students(string name, int age) :base(age) 
    { 
     this.studentName = name; 
     this.Age = age; 
    } 

    public string studentName; 
} 

अब, मान लीजिए कि आपने छात्रों से एक वस्तु का निर्माण कर रहे:

+0

ठीक है, मैं समझता हूं कि इसे हल करने के लिए क्यों संभव नहीं है। तो ऐसा लगता है कि मुझे एक कामकाज का उपयोग करना है। – Kai

+0

कृपया किसी अन्य विकल्प पर ध्यान से अन्य सभी लोगों के उत्तरों को पढ़ें – Nick

-1

असल में, आप यहाँ कर हां, तो आप बच्चे वर्ग उदाहरण से माता पिता वर्ग निर्माता सक्रिय कर सकता है सकते हैं, तुम कैसे करते है कक्षा, तो, आप यह करेंगे:

छात्र std = new students ("जैक", 23);

यह छात्रों के वर्ग निर्माता के लिए "जैक" भेज देंगे, और 23 के माध्यम से व्यक्ति निर्माता को भेज दिया जाएगा: आधार (आयु)

आशा इस मदद, चीयर्स।

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