मैंने व्हाइटफैंग 34 के उत्तर की कोशिश नहीं की है। यह काम कर सकता है, लेकिन मैं इस पर स्पष्ट नहीं हूं ...
यदि आप वास्तव में बाहरी कक्षा की तुलना में कहीं भी अपनी आंतरिक कक्षा का विस्तार परिभाषित करना चाहते हैं, तो सबसे स्वाभाविक चीज़ इसे विस्तार के रूप में परिभाषित करना होगा एक और बाहरी अपने बाहरी वर्ग का विस्तार में भीतरी वर्ग के इस प्रकार है:
class Outer {
int some_member;
abstract class InnerBase {
abstract void method();
}
}
class OuterExtendsOuter extends Outer {
class InnerExtendsInner extends Outer.InnerBase {
void method() {
System.out.println(some_member);
}
}
}
मैं वास्तव में या तो इस कोड नहीं चला है, लेकिन यह काम करना चाहिए।
अद्यतन:
टिप्पणी थ्रेड के आधार पर, मैं अब संकलित और ऊपर मेरी कोड और WhiteFang34 के कोड दोनों समाप्त हो गया है।
वास्तव में दोनों काम करते हैं, लेकिन जैसा कि पालो एबरमान द्वारा टिप्पणियों में उल्लेख किया गया है, दोनों तत्काल आंतरिक कक्षा के अंदर बाहरी की दो प्रतियां बनाते हैं।
मैं पैलो के जवाब को ऊपर उठाने जा रहा हूं, और यह केवल रणनीति द्वारा ऐसा करने की कोशिश नहीं करने का समर्थन करेगा, क्योंकि यह वास्तव में आंतरिक वर्ग तंत्र का दुरुपयोग है।
बस अपनी विस्तारित आंतरिक कक्षाएं एक ही बाहरी कक्षा के अंदर रहें!
अद्यतन 2:
क्या मेरी कोड में होता है, एक डिबगर का उपयोग कर क्रम परीक्षा पर और वर्गों के javap निरीक्षण से उत्पादन की जांच के आधार पर, कि दोनों InnerBase
और OuterExtendsOuter$InnerExtendsInner
सिंथेटिक निजी अंतिम नामित क्षेत्रों है this$0
। क्योंकि कोई कंस्ट्रक्टर्स स्पष्ट रूप से परिभाषित कर रहे हैं, डिफ़ॉल्ट कंस्ट्रक्टर्स उपयोग किया जाता है, और कोड स्निपेट
OuterExtendsOuter outer = new OuterExtendsOuter();
Outer.InnerBase inner = outer.new InnerExtendsInner();
दोनों संदर्भ outer
करने के लिए इन दो क्षेत्रों का कारण बनता है।
दूसरे शब्दों में, पालो की टिप्पणी पूरी तरह से सही है।
आगे प्रयोग करके, एक ही वास्तव में अगर आप Outer
का एक और भीतरी कक्षा में InnerBase
का विस्तार होता है, तो यह थोड़ा के साथ यह एक ही बाहरी कक्षा या इसके बारे में एक विस्तार में परिभाषित किया जा रहा करने के लिए है, लेकिन वास्तव में एक परिणाम है गैर स्थैतिक आंतरिक कक्षाओं को आम तौर पर कैसे संभाला जाता है।
मुझे संदेह है कि यह कहीं भी दस्तावेज है, लेकिन मैंने इसे नहीं देखा है।
शायद विरासत और आंतरिक कक्षाओं को जितना संभव हो सके मिश्रण करने के लिए सबसे अच्छा!
"बेहतर कोड संगठन" में शायद ही कभी आंतरिक वर्ग शामिल होते हैं, और मैं कल्पना नहीं कर सकता कि इसमें कभी ऐसा कुछ शामिल है। – Anon
यही कारण है कि मैं बाहरी वर्ग के बाहर भीतरी कक्षा का विस्तार करना चाहता था। मैं एक दुभाषिया को लागू कर रहा हूं, और प्रत्येक "आंतरिक" वर्ग एक प्रकार (नाम, पूर्णांक, आदि) मॉडल करता है। प्रकार के व्यवहार को बनाने वाले दुभाषिया ऑब्जेक्ट के संदर्भ की आवश्यकता हो सकती है या नहीं। मैं प्रत्येक विधि के लिए एक दुभाषिया संदर्भ पारित करके समस्या के आसपास चला गया है जिसकी आवश्यकता हो सकती है। – zvrba