2010-04-06 7 views
23

संभव डुप्लिकेट:
Why is super.super.method(); not allowed in Java?जावा ग्रैंड माता-पिता की विधि कैसे कॉल करें?

के मैं 3 वर्गों A, B और C, हर एक पिछले एक विस्तार है मान लेते हैं।

C.myMethod() से A.myMethod() में कोड को मैं कैसे कॉल करूं यदि BmyMethod लागू करता है?

class A 
{ 
    public void myMethod() 
    { 
    // some stuff for A 
    } 
} 

class B extends A 
{ 
    public void myMethod() 
    { 
    // some stuff for B 
    //and than calling A stuff 
    super.myMethod(); 
    } 
} 

class C extends B 
{ 
    public void myMethod() 
    { 
    // some stuff for C 
    // i don't need stuff from b, but i need call stuff from A 
    // something like: super.super.myMethod(); ?? how to call A.myMethod(); ?? 
    } 
} 
+0

आप ऐसा क्यों करेंगे? क्या आप एक उदाहरण दे सकते हैं? – Macarse

उत्तर

18

आप नहीं कर सकते। यह जानबूझकर है।

कक्षा B सबक्लास में एक इंटरफ़ेस (अवधारणा के रूप में, जावा कीवर्ड नहीं) प्रदान करता है। यह A.myMethod की कार्यक्षमता तक सीधे पहुंच न देने के लिए चुना गया है। यदि आपको उस कार्यक्षमता को प्रदान करने के लिए B की आवश्यकता है, तो इसके लिए एक अलग विधि का उपयोग करें (अलग नाम, इसे protected बनाएं)। हालांकि, शायद "विरासत पर संरचना पसंद करना" बेहतर है।

+0

धन्यवाद दोस्तों! मैं अपने डिजाइन को फिर से काम करने की कोशिश करूंगा। – Arkaha

+0

अरकाहा, अपने प्रश्न का उत्तर देखें। यह सुपरक्लास द्वारा परिभाषित विधि को कॉल करने के लिए वाक्य रचनात्मक रूप से संभव है कि यह आपके तत्काल पूर्वजों (आपका * सुपर *) नहीं है। लेकिन आपको ऐसा करने के लिए एक वैध कारण होना चाहिए। –

0

मुझे यकीन नहीं है कि आप कर सकते हैं। जावा सभी तरीकों को डिफ़ॉल्ट रूप से आभासी बनाता है। इसका मतलब है कि सबसे सरल समाधान काम नहीं करेगा: A प्रकार के एक चर घोषित करें, अपने C उदाहरण को असाइन करें और myMethod पर कॉल करें C.myMethod कहा जाएगा।

आप A टाइप करने और सीधे अपनी विधियों को प्रतिबिंबित करने का प्रयास कर सकते हैं। यह देखना दिलचस्प होगा कि इस मामले में क्या होता है, लेकिन अगर मुझे वर्चुअल प्रेषण नहीं होता है तो मुझे आश्चर्य होगा ...

2

आप नहीं कर सकते हैं, और आपको नहीं करना चाहिए।

यह खराब डिजाइन का संकेत है। या तो किसी विधि का नाम बदलें या किसी अन्य विधि या उपयोगिता वर्ग में आवश्यक सामान्य कार्यक्षमता शामिल करें।

+1

प्रतिबिंब * यह * ऐसा करने का कोई तरीका नहीं प्रदान करता है, रनटाइम बहुरूपता के सामान्य नियम ** अभी भी ** लागू होंगे। आप प्रतिबिंब का उपयोग करके 'super.myMethod()' को भी लागू नहीं कर सकते हैं, अकेले सैद्धांतिक 'super.super.myMethod()' दें। –

+0

सही। अपडेट किया गया। – Bozho

+0

जरूरी नहीं है, आपको ऐसा करने की ज़रूरत है जब आप आंतरिक कक्षाओं को परिभाषित करते हैं (उदाहरण के लिए, स्विंग में कार्रवाई श्रोताओं को परिभाषित करना या कक्षाओं को वापस बुलाएं।) ऐसी परिस्थितियों के बाहर, हाँ, यह खराब डिज़ाइन है, लेकिन * स्वयं * यह नहीं है। जावा सिंटैक्स इसे किसी भी तरह का समर्थन करता है (अरकाहा के प्रश्न पर मेरी प्रतिक्रिया देखें।) –

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