2010-08-03 15 views
5

मैं (पहली पंक्ति में बीच एक (सुपर उपयोग कर सकते हैं या इस)) इसएक और निर्माता

public class Class1 
    { 
     public Class1() 
     { 

     } 
     public Class1(int a) 
     { 

     } 
    } 
    public class Class2 :Class1 
    { 
     public Class2(int a) 
     { 

     } 
     public Class2(): base(2) 
     { 
     this(2); // new Class2(2); 
     } 

    } 

मैं जानता हूँ कि यह जावा में प्राप्त नहीं किया जा सकता है की तरह कुछ करने के लिए

चाहते से निर्माता कॉलिंग

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

उत्तर

9

MSDN article रचनाकारों पर बहुत अच्छा है। यहाँ कुछ प्रासंगिक बिट कर रहे हैं:

एक निर्माता एक आधार वर्ग के निर्माता कॉल करने के लिए आधार कीवर्ड उपयोग कर सकते हैं।
....
एक कन्स्ट्रक्टर इस कीवर्ड में का उपयोग करके एक ही ऑब्जेक्ट में कन्स्ट्रक्टर का आह्वान कर सकता है। आधार की तरह, यह पैरामीटर के साथ या बिना उपयोग किए जा सकते हैं, और कन्स्ट्रक्टर में किसी भी पैरामीटर इस पैरामीटर के रूप में उपलब्ध हैं, या अभिव्यक्ति के हिस्से के रूप में।

यह काम करना चाहिए:

public class Class1 
{ 
    public Class1() 
    { 

    } 
    public Class1(int a) 
    { 

    } 
} 
public class Class2 :Class1 
{ 
    public Class2(int a) : base(a) 
    { 

    } 
    public Class2(): this(2) 
    { 
    } 

} 
+0

एकमात्र संभावित समस्या जो मैं यहां देख सकता हूं वह होगा यदि आप ** कक्षा 2 (int ए) नहीं चाहते हैं: आधार (ए) ', लेकिन ** ** ** कक्षा 2(): आधार (2) '। हालांकि, मैं कक्षा संरचना के बारे में नहीं सोच सकता जहां ऐसा निर्णय सबसे अच्छा डिजाइन होगा। –

+0

जो मुझे पता है, लेकिन मैं उनमें से दो को व्युत्पन्न वर्ग के डिफ़ॉल्ट कन्स्ट्रक्टर में निष्पादित करना चाहता हूं, जिसे मैं आधार के पैरामीटरयुक्त कन्स्ट्रक्टर को निष्पादित करना चाहता हूं और साथ ही व्युत्पन्न वर्ग के डिफ़ॉल्ट कन्स्ट्रक्टर (परिभाषा में कहीं भी लिख सकता हूं) – Nits

+2

दाएं , आप ऐसा नहीं कर सकते हैं, आप केवल * एक अन्य कन्स्ट्रक्टर * को कॉल कर सकते हैं, दोनों नहीं। मुझे लगता है कि आपको उस डिजाइन पर पुनर्विचार करना चाहिए जिसके लिए रचनाकारों को इस तरह से बुलाया जाना चाहिए। –

2

इगोर का जवाब कैसे आप इस स्थिति में कंस्ट्रक्टर्स लिखना चाहिए का एक अच्छा उदाहरण है। अपने अंतिम वाक्य के अधिक सामान्य मामले को संबोधित करने के लिए: आप एक से अधिक कन्स्ट्रक्टर तक श्रृंखला नहीं बना सकते हैं। आप वर्तमान श्रेणी में एक बेस कन्स्ट्रक्टर और अन्य कन्स्ट्रक्टर को कॉल नहीं कर सकते हैं।

अधिभारित कन्स्ट्रक्टर के लिए दो विशिष्ट पैटर्न हैं। पहले पैटर्न में, व्युत्पन्न वर्ग के अधिभार का सेट बेस क्लास के लिए ओवरलोड के सेट से मोटे तौर पर मेल खाता है - आप व्युत्पन्न वर्ग को महसूस करते हैं कि इसे रचनाकारों को प्रभावी ढंग से विरासत में मिला है। (रचनाकार स्वयं विरासत में नहीं हैं, लेकिन यदि आप एक ही हस्ताक्षर प्रदान करते हैं तो यह कॉलर को ऐसा लगता है।) यह आमतौर पर ऐसा होता है जब आपके व्युत्पन्न वर्ग को अतिरिक्त जानकारी की आवश्यकता नहीं होती है। बेशक प्रत्येक कन्स्ट्रक्टर अतिरिक्त पैरामीटर हो सकता है, और केवल बेस कन्स्ट्रक्टर तक सबसेट पास कर सकता है, लेकिन यह जटिल हो सकता है।

दूसरे पैटर्न में, आपके पास व्युत्पन्न कक्षा में कई रचनाकार हैं जिनमें से प्रत्येक एक ही (व्युत्पन्न) कक्षा में "मास्टर" कन्स्ट्रक्टर कहलाता है। इस मास्टर कन्स्ट्रक्टर में सबसे अधिक पैरामीटर हैं, क्योंकि इसे किसी भी अन्य रचनाकारों द्वारा निर्दिष्ट सबकुछ को संभालने में सक्षम होना चाहिए। कभी-कभी मास्टर कन्स्ट्रक्टर निजी होना चाहिए, अगर कुछ संयोजन समझ में नहीं आते हैं, लेकिन एक जगह में निर्दिष्ट करना सुविधाजनक होता है जब आप जानते हैं कि आप केवल एक समझदार सार्वजनिक कन्स्ट्रक्टर के माध्यम से कोड तक पहुंच सकते हैं। इस मामले में, केवल कि "मास्टर" कन्स्ट्रक्टर श्रृंखला सीधे बेस क्लास कन्स्ट्रक्टर के लिए है। आमतौर पर इसका उपयोग तब किया जाता है जब व्युत्पन्न वर्ग में बेस क्लास की आवश्यकता के अलावा जानकारी के कई अतिरिक्त टुकड़े होते हैं।

इस पैटर्न के संकर हैं जहां आपके पास मास्टर्स को बुलाए जाने वाले ओवरलोड के "समूह" के साथ कई स्वामी हैं ... लेकिन मैं आपको सलाह देता हूं कि जहां भी संभव हो सके इसे सरल रखें। रचनाकारों की बजाय स्थैतिक फैक्ट्री विधियों को उपलब्ध कराने की संभावना पर भी विचार करें - जो अधिक पठनीय कोड बनाने के लिए समाप्त हो सकते हैं क्योंकि आप उनके उद्देश्य/पैरामीटर द्वारा विधियों का नाम दे सकते हैं - उदाहरण के लिए TimeSpan.FromMinutes देखें।

1

दोनों भाषाओं में (एक अच्छे कारण के लिए) असंभव है। अन्यथा यदि आप कोई स्पष्ट आधार या यह स्पष्ट आधार कॉल के कारण बेस-कन्स्ट्रक्टर को कई बार कॉल करेंगे। इससे अवांछित व्यवहार हो सकता है।

+0

के डिफ़ॉल्ट कन्स्ट्रक्टर की परिभाषा में उपयोग नहीं कर सकता है यह भी मेरे लिए अच्छा लग रहा है। लेकिन अगर हम एक ही बेस कंसट्र्यूटर – Nits

+0

अधिक समय कॉल करते हैं तो नुकसान क्या होता है एक कन्स्ट्रक्टर केवल एक बार चलाना चाहिए। यदि डिफ़ॉल्ट चर सेट करने जैसी इसकी एकमात्र आसान प्रारंभिकता कोई समस्या नहीं है (प्रदर्शन को छोड़कर आप दो बार कार्य करते हैं) लेकिन यदि आप अपने कन्स्ट्रक्टर में एक सूची पॉप्युलेट करेंगे, तो आपके पास सभी प्रविष्टियां दो बार थीं। मुझे लगता है कि बेहतर कारण हैं, मेरे लिए यह असुरक्षित लगता है। शायद कोई बेहतर उदाहरण प्रदान कर सकता है? – atamanroman

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