2009-09-06 12 views
14

मैं एक तर्क है कि सभी बच्चे कक्षाओं द्वारा स्वचालित रूप से विरासत में मिला हो जाता है के साथ एक निर्माता करना चाहते हैं, लेकिन जावा मुझे ऐसा नहीं दूँगी इसजावा: इनहेरिट निर्माता

class A { 
    public A(int x) { 
    // Shared code here 
    } 
} 

class B extends A { 
    // Implicit (int x) constructor from A 
} 

class C extends A { 
    // Implicit (int x) constructor from A 
} 

मेरे पास है नहीं करना चाहते प्रत्येक बच्चे वर्ग के लिए B(int x), C(int x) आदि लिखने के लिए। क्या इस समस्या का सामना करने का कोई बेहतर तरीका है?

समाधान # 1। एक init() विधि बनाएं जिसे कन्स्ट्रक्टर के बाद बुलाया जा सके। यह काम करता है, हालांकि मेरे विशेष डिजाइन के लिए, मैं उपयोगकर्ता को संकलक में कुछ पैरामीटर निर्दिष्ट करने की आवश्यकता करना चाहता हूं जो संकलन समय पर मान्य हैं (उदाहरण के लिए varargs/प्रतिबिंब के माध्यम से नहीं)।

उत्तर

26

आप नहीं कर सकते। यदि आप अपनी बेस क्लास में पैरामीटरयुक्त कन्स्ट्रक्टर रखना चाहते हैं - और कोई नो-तर्क कन्स्ट्रक्टर नहीं है - आपको वंश के प्रत्येक वर्ग में एक कन्स्ट्रक्टर (और super() कन्स्ट्रक्टर) को परिभाषित करना होगा।

+14

क्या एक बमर .. – machete

+1

कोई फर्क नहीं पड़ता कि मुझे कितनी बार याद दिलाया जाता है, यह अभी भी परेशान है। व्यापक आधार वर्ग बनाने के लिए इस प्रयास में रखो, फिर बच्चे 50 लाइनर के रूप में समाप्त हो जाते हैं क्योंकि मुझे इतना बॉयलरप्लेट –

2

आप जावा में नहीं हो सकते हैं। आप विधि में उन्हें स्पष्ट रूप से घोषित किए बिना एक विधि तर्क नहीं दे सकते हैं। ऐसा करने से शायद सबसे अच्छा विचार नहीं होगा, इससे बहुत भ्रमित कोड और अधिक जटिल चीजें हो सकती हैं। कुछ अतिरिक्त वर्ण टाइप करने का विकल्प नहीं है जो खराब है। : डी

4

Inheritance

सारांश: एक उपवर्ग अपने सुपर क्लास से सभी सदस्यों (खेतों, विधियों, और नेस्ट वर्ग) इनहेरिट करती है। कन्स्ट्रक्टर सदस्य नहीं हैं, इसलिए वे उप-वर्गों द्वारा विरासत में नहीं हैं, लेकिन सुपरक्लास के निर्माता को उप-वर्ग से बुलाया जा सकता है।

12

अन्य उत्तरों सही हैं कि जावा आपको रचनाकारों का उत्तराधिकारी नहीं होने देगा। लेकिन आईडीई का उपयोग आपके सभी वर्गों के लिए इन्हें बनाने के बड़े बोझ को कम करने में मदद के लिए किया जा सकता है।

ग्रहण में "स्रोत" मेनू पर जाएं और "सुपरक्लास से रचनाकार उत्पन्न करें ..." चुनें। एक नई कक्षा बनाने के लिए संवाद का उपयोग करते समय आप इसे एक विकल्प के रूप में भी चुन सकते हैं।

+5

हम्मम ओवरराइट करना होगा ... एक व्यक्ति का "भारी बोझ" एक और व्यक्ति का मामूली कार्य है। –

+0

इंटेलिजे आईडीईए में, आप Alt + सम्मिलित कर सकते हैं और कन्स्ट्रक्टर चुन सकते हैं। इससे एक मेनू सामने आएगा जहां आप एक या अधिक अभिभावक रचनाकारों को लागू करने के लिए चुन सकते हैं, और वे स्वचालित रूप से बनाए जाएंगे। – Patrick

0

यदि आपके पास एक डिफ़ॉल्ट मान है जिसे आप असाइन करना चाहते हैं तो आप बेस क्लास में एक खाली कन्स्ट्रक्टर बना सकते हैं जो पैरामीटरयुक्त कन्स्ट्रक्टर को कॉल करता है।

यह पैरामीटरयुक्त कन्स्ट्रक्टर को कॉल करने के लिए बाल कक्षाओं की आवश्यकता को हटा देगा।

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