2011-06-11 13 views
95

तो कहें कि मेरे पास एक सबक्लास है जो सुपरक्लास को बढ़ाता है। सुपरक्लास कन्स्ट्रक्टर चलाने के लिए मुझे किन परिदृश्यों में super() को स्पष्ट रूप से टाइप करने की आवश्यकता है?आपको सुपरक्लस कन्स्ट्रक्टर को स्पष्ट रूप से कॉल करने की आवश्यकता कब है?

मैं अमूर्त वर्गों के बारे में एक पुस्तक में एक उदाहरण देख रहा हूं और जब वे इसे एक गैर-सारणी सबक्लास के साथ बढ़ाते हैं, तो सबक्लास का डिफ़ॉल्ट कन्स्ट्रक्टर खाली होता है और एक टिप्पणी है जो सुपरक्लास के डिफ़ॉल्ट कन्स्ट्रक्टर को बुलाया जाएगा। साथ ही मैंने यहां उदाहरण भी देखे हैं जहां किसी की समस्या स्पष्ट रूप से super() पर कॉल नहीं कर रही थी।

क्या सुपरक्लास के डिफ़ॉल्ट/गैर-डिफ़ॉल्ट कन्स्ट्रक्टर से सुपरक्लास के डिफ़ॉल्ट/गैर-डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करने से भेद है?

+0

यह मुझे है या जवाब में से कोई भी सवाल –

उत्तर

137

आप कभी नहीं जरूरत सिर्फ

super(); 

है यही कारण है कि वहाँ हो जाएगा आप कुछ और निर्दिष्ट नहीं करते हैं। आप केवल कॉल करने के लिए निर्माता निर्दिष्ट करने की आवश्यकता है, तो:

  • तुम एक सुपर क्लास निर्माता जो पैरामीटर सुपर क्लास निर्माता के बजाय एक ही कक्षा में एक और निर्माता के लिए कॉल करने के लिए
  • आप श्रृंखला करना चाहते हैं चाहते

आप का दावा है कि:

एक ही समय में मैं भी यहाँ पर उदाहरणों को देखा है जहां किसी की समस्या explic नहीं किया गया था यह सुपर कॉलिंग()।

क्या आप कोई उदाहरण दे सकते हैं? मैं कल्पना नहीं कर सकता कि यह कैसे संभव है ...

+4

हाँ मुझे और स्पष्ट होना चाहिए था। यह सुपर था (तर्क के साथ)। आपके उत्तर के लिए धन्यवाद। – jhlu87

+0

आप सही हैं। लेकिन इसके बारे में: 'साथ ही मैंने यहां उदाहरण भी देखे हैं जहां किसी की समस्या स्पष्ट रूप से सुपर()' नहीं कह रही थी। ' ऐसा तब होता है जब अभिभावक कन्स्ट्रक्टर में नोर्ग कन्स्ट्रक्टर नहीं होता है। उस स्थिति में यदि आप स्पष्ट रूप से सुपर() को कॉल नहीं करते हैं तो आपको एक त्रुटि मिल जाएगी। – ACV

+1

@ACV: स्पष्ट रूप से 'सुपर()' को कॉल करने से वहां पर काम नहीं किया जाएगा। एक गैर-खाली तर्क सूची * के साथ एक superconstructor * को कॉल करना * काम करेगा, लेकिन केवल 'सुपर() 'का उपयोग नहीं करेगा। –

10

यदि आप स्पष्ट रूप से सुपर कन्स्ट्रक्टर को नहीं कहते हैं तो तर्क कम कन्स्ट्रक्टर (सुपर()) कहा जाएगा। इसका मतलब है कि यदि आपको सुपर क्लास का कोई पहुंच योग्य तर्क-कम कन्स्ट्रक्टर नहीं है तो आपको एक विशिष्ट कन्स्ट्रक्टर स्वयं को कॉल करना होगा।

लेकिन अक्सर आप एक अलग कन्स्ट्रक्टर चाहते हैं, भले ही आप डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग कर सकें - आपके कोड पर निर्भर करता है।

यह भी ध्यान दें कि यदि कोई कन्स्ट्रक्टर घोषित नहीं किया गया है तो संकलक स्वचालित रूप से सार्वजनिक डिफॉल्ट कन्स्ट्रक्टर उत्पन्न करता है, लेकिन जैसे ही आप अपना स्वयं का कन्स्ट्रक्टर लिखते हैं, यह अब और नहीं होता है।

+1

"तुम क्यों एक उपवर्ग में एक सुपर क्लास 'निर्माता कॉल करने के लिए की जरूरत है" बस सुनिश्चित करें कि मैं समझता हूँ बनाने के लिए को संबोधित करता है। अगर मेरे सुपरक्लास में, मेरे पास एक कन्स्ट्रक्टर है और यह डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है (कहें कि यह पैरामीटर लेता है)। फिर मेरे सबक्लस के लिए मेरे कन्स्ट्रक्टर में मुझे सुपर (पैरा) को स्पष्ट रूप से कॉल करने की आवश्यकता है क्योंकि संकलक अब सुपर क्लास के लिए डिफ़ॉल्ट कन्स्ट्रक्टर उत्पन्न नहीं करेगा? – jhlu87

+1

@ jhlu87, सही – bestsss

4

super() विधि हमेशा उप-वर्गों के रचनाकारों में बुलाया जाता है, भले ही यह कोड में स्पष्ट रूप से लिखा न हो।

केवल बार जब आप इसे लिखने की ज़रूरत है, अगर वहाँ अलग आरंभीकरण पैरामीटर के साथ सुपर क्लास में कई super(...) तरीके हैं है।

+5

"आपको इसे लिखने की एकमात्र समय है, अगर विभिन्न प्रारंभिक पैरामीटर के साथ सुपरक्लास में कई सुपर (...) विधियां हैं।" सच नहीं। जब तक एक पहुंच योग्य तर्क कम कन्स्ट्रक्टर होता है, तब तक आपके पास बिना किसी समस्या के सौ अन्य रचनाकार हो सकते हैं। – Voo

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