2011-06-30 14 views
7

के क्षेत्र तक पहुंचने से आंतरिक कक्षा के किसी ऑब्जेक्ट के संदर्भ में, मैं बाहरी वर्ग के क्षेत्र तक कैसे पहुंच सकता हूं?बाहरी वर्ग

class Outer 
{ 
    int field; 

    class Inner 
    { 
     void method(Inner parameter) 
     { 
      // working on the current instance is easy :) 
      field = 0; 
      Outer.this.field = 1; 

      // working on another instance is hard :(
      parameter.field = 2;    // does not compile 
      parameter.Outer.this.field = 3; // does not compile 
      parameter.outer().field = 4;  // This works... 
     } 

     // ...but I really don't want to have to write this method! 
     Outer outer() 
     { 
      return Outer.this; 
     } 
    } 
} 

मैंने Outer.parameter.field और कई अन्य रूपों का भी प्रयास किया। क्या कोई वाक्यविन्यास है जो मैं चाहता हूं?

+0

करने के लिए सिर्फ इसकी बाहरी वर्ग के अंदर इस्तेमाल किया गया एक आंतरिक वर्ग के उद्देश्य नहीं है? – Heisenbug

+0

मुझे लगता है कि ऐसा करने का तरीका है। अगर आपको लगता है कि यह गलत है तो आप उन वर्गों को अलग-अलग रीफैक्टरिंग या बिल्डिंग के बारे में सोच सकते हैं? – Luciano

+5

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

उत्तर

2

एक स्थिर विधि या गैर स्थैतिक विधि के रूप में आप जो कर रहे हैं, उसे देखने के दो तरीके हैं।

पहली नज़र में, आपका उदाहरण एक स्थिर विधि की तरह दिखता है, क्योंकि यह अपने राज्य की बजाय पैरामीटर की स्थिति में हेरफेर कर रहा है। स्थिर समस्या को पहले कवर किया गया है, उदा। देखें In Java, how do I access the outer class when I'm not in the inner class?

लेकिन आपका उदाहरण एक गैर स्थैतिक विधि का है, और मुझे लगता है कि मैं देख रहा हूं कि आप क्या प्राप्त कर रहे हैं और आप क्यों सोचते हैं कि बाहरी संदर्भ संभव होना चाहिए। आखिरकार, ऐसी अन्य स्थितियां हैं जिनमें आप अपने स्वयं के प्रकार के अन्य उदाहरणों के कार्यान्वयन विवरण तक पहुंच सकते हैं - उदाहरण के लिए, बराबर ओवरराइड करते समय इनपुट पैरामीटर के निजी सदस्य फ़ील्ड को संदर्भित करना आम बात है। दुर्भाग्य से मुझे नहीं लगता कि जावा किसी अन्य के स्पष्ट रूप से संलग्न उदाहरण को संदर्भित करने का एक तरीका प्रदान करता है। यह शायद the way that java actually implements non-static inner classes के साथ कुछ करने के लिए है। जावा अपने उद्देश्यों के लिए this$0 का उपयोग करता है, लेकिन आपके पास इस सिंथेटिक फ़ील्ड तक पहुंच नहीं है।

8

आंतरिक वर्ग के बाहर से, मेरा मानना ​​है कि बाहरी वर्ग के उदाहरणों के संदर्भ में, आंतरिक कक्षा के उदाहरण के संदर्भ में कोई रास्ता नहीं है। एक गैर स्थैतिक आंतरिक कक्षा के अंदर से, आप निश्चित रूप से Outer.this.* वाक्यविन्यास का उपयोग कर संदर्भित कर सकते हैं।

इस बारे में सोचें: आंतरिक वर्ग वास्तव में एक पूरी तरह से अलग वर्ग है। इसमें एक कंपाइलर-जेनरेटेड फ़ील्ड है (आमतौर पर this$0 जैसे अजीब कुछ नाम दिया जाता है)। आंतरिक कक्षा के भीतर, भाषा आपको Outer.this का उपयोग करके उस फ़ील्ड को संदर्भित करने की अनुमति देती है; हालांकि, सिंटैक्टिक चीनी आंतरिक कक्षा के बाहर ही उपलब्ध नहीं है। न तो संकलक उत्पन्न क्षेत्र है।

8

कैसे इस समाधान के बारे में:

class Outer 
{ 
    int field; 

    class Inner 
    { 
     final Outer outer = Outer.this; 
     void method(Inner parameter) 
     { 
      // working on the current instance is easy :) 
      field = 0; 
      Outer.this.field = 1; 

      // working on another instance: 
      parameter.outer.field = 2; 
     } 
    } 
} 
+0

इस तरह मैं हमेशा ऐसा करता हूं, हालांकि मैं एक गैर- आपके उदाहरण के लिए प्रबल क्षेत्र। अभिभावक दायरे के लिए केवल एक संदर्भ संग्रहीत करना और इसके माध्यम से फ़ील्ड तक पहुंचने से 'फ़ील्ड' के लिए एक पुराने संदर्भ का उपयोग करने से बचा जाता है, जब यह एक प्राचीन के बजाय ऑब्जेक्ट होता है, जो इस दृष्टिकोण का मुख्य लाभ है। – KomodoDave

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