2011-04-19 11 views
5

मुझे यकीन नहीं है कि मेरा प्रश्न शीर्षक मेरी स्थिति का सही वर्णन करता है, इसलिए अगर माफी माँगती है तो मेरी माफ़ी नहीं है!() ParentClass में पाया एक संरक्षित विधि का उपयोग करने के anotherMethod भीतरक्या एक आंतरिक कक्षा में कोई विधि अभिभावक वर्ग विधि तक पहुंच सकती है?

public class ChildClass extends ParentClass { 
    // more code 
    private void myMethod() { 
     MyClass mine = new MyClass() { 
     public void anotherMethod() { 
      // insert code to access a method in ParentClass 
     } 
     }; 
    } 
} 

क्या यह संभव है कोड के लिए: वैसे भी, चलो कहते हैं कि मैं निम्नलिखित कोड का टुकड़ा (दृश्यता कहा गया है के रूप में) डालते हैं? यदि हां, तो यह कैसे किया जा सकता है?

मैं कुछ तरह की कोशिश की है ...

(ParentClass.this).parentMethod(); 

... लेकिन स्पष्ट रूप से यह गुंजाइश मुद्दों की वजह से काम नहीं करता।

+2

तुम सिर्फ 'parentMethod()' कॉल नहीं कर सकते बजाय '(ParentClass.this) .parentMethod();' – Nishan

+0

'ParentClass में पाया एक संरक्षित विधि' हो सकता है विरासत –

उत्तर

8

यह ठीक संकलित:

class MyClass { 
} 

class ParentClass { 
    protected void parentMethod() { 
    } 
} 

class ChildClass extends ParentClass { 
    private void myMethod() { 
     MyClass mine = new MyClass() { 
      public void anotherMethod() { 
       parentMethod(); // this works 
      } 
     }; 
    } 
} 
+0

+1 के कारण बच्चे में भी पाया गया: यह केवल तभी काम करेगा जब माता-पिता कॉलर के समान पैकेज में हों। यानी क्योंकि 'संरक्षित' बच्चों तक पहुंच की अनुमति देता है और स्थानीय वर्गों को पैकेज करता है। –

+0

@ पीटर: हम्म, क्या आप निश्चित हैं? मैंने बस 3 अलग-अलग पैकेजों में सभी 3 कक्षाओं को डालने की कोशिश की। मुझे लगता है कि यह काम करता है क्योंकि 'myMethod() 'में' MyClass' वास्तव में एक आंतरिक वर्ग है जिसकी बाहरी कक्षा 'चाइल्डक्लास' की 'संरक्षित' विधियों तक पहुंच है, और इस प्रकार 'पेरेंट क्लास' यह विस्तारित है। – WhiteFang34

+0

@ व्हाइटफैंग 34, आप सही हैं। मैंने अपने टेस्ट कोड को सही तरीके से संकलित नहीं किया। –

6

एक गैर स्थिर भीतरी वर्ग अगर यह अपने आप तरीकों थे के रूप में संलग्नित क्लास के सभी तरीकों का उपयोग कर सकते हैं:

public class Test { 
    public int getOne() { 
     return 1; 
    } 

    public class Inner { 
     public int getEnclosingOne() { 
      return getOne(); // this works... 
     } 
    } 
} 

एक स्थिर भीतरी वर्ग नहीं कर सकते हैं, एक स्थिर भीतरी वर्ग एक के लिए बाध्य नहीं है के रूप में अभिभावक वर्ग का उदाहरण। यह केवल संलग्न वर्ग पर स्थिर तरीकों को कॉल कर सकता है।

खाता विरासत में लेने के तरीकों के लिए, गैर स्थैतिक आंतरिक कक्षा में एक विधि संलग्न (बाहरी) वर्ग के सभी तरीकों का उपयोग कर सकती है।

दिलचस्प हिस्सा Test2.super.getOne() है जो वास्तव में Test2.super से प्राप्त होता है, जो Test है। यह टेस्ट 2 की तरह है, विधि का उपयोग करेगा, अर्थात् super का उपयोग करते हुए Test2 के साथ प्रीफ़िक्स किया गया है ताकि आप बाहरी वर्ग के नामस्थान तक पहुंच सकें।

public class Test2 extends Test { 

    public int getInnerOuterParentOne() { 
     Inner2 inner2 = new Inner2(); 
     return inner2.getOuterParentOne(); 
    } 
    public int getInnerOuterOne() { 
     Inner2 inner2 = new Inner2(); 
     return inner2.getOuterOne(); 
    } 

    public int getOne() { 
     return 2; 
    } 

    public class Inner2 { 
     public int getOuterOne() { 
      return getOne(); 
     } 
     public int getOuterParentOne() { 
      return Test2.super.getOne(); 
     } 
    } 

    public static void main(String[] args) { 
     Test2 test2 = new Test2(); 
     System.out.println(test2.getInnerOuterOne()); // 2 
     System.out.println(test2.getInnerOuterParentOne()); // 1 
    } 
} 
1

जावा में "जनक वर्ग विधि" का उपयोग करने की, irrelatively (उपवर्ग के parentMethod() में super.parentMethod() को छोड़कर) दृश्यता का कोई तरीका नहीं है।

है कि, अगर ChildClass ओवरराइड parentMethod() कोई तरीका नहीं ChildClass के अन्य तरीकों से ParentClass.parentMethod() (दरकिनार ChildClass.parentMethod()) कॉल करने के लिए है।

हालांकि, अगर ChildClassparentMethod() पर हावी नहीं होता, उस विधि ChildClass द्वारा, है, यानी बस parentMethod() के रूप में विरासत में मिला है, ताकि आप एक ChildClass के तरीके के रूप में उपयोग कर सकते हैं है।

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