2012-11-18 22 views
16

में नेस्टेड अमूर्त वर्ग क्यों है, मुझे आश्चर्य है कि घोंसला वाले अमूर्त वर्ग के लिए इसका क्या अर्थ है? उदाहरण के लिए,जावा

abstract class A{ 

      abstract class B{ 

      } 
    } 

वहाँ किसी भी उपयोग के मामलों या परिदृश्य है कि हम डिजाइन के रूप में ऐसी आवश्यकता हो सकती है कर रहे हैं? या ऐसे पैटर्न में कुछ उपयोगी है? और जावा हमें ऐसा करने की अनुमति क्यों देता है?

उत्तर

4

डिज़ाइन में, आप बेस क्लास class A चाहते हैं ताकि वह व्युत्पन्न कक्षाओं के लिए केवल एक इंटरफ़ेस पेश कर सके। इसका मतलब है, आप नहीं चाहते हैं कि कोई भी बेस क्लास की वस्तु को तुरंत चालू करे। आप केवल अपस्टास्ट पर (अंतर्निहित अपकास्टिंग, जो आपको पॉलिमॉर्फिक व्यवहार देता है), ताकि इसका इंटरफ़ेस उपयोग किया जा सके। यह सार तत्व का उपयोग करके उस वर्ग सार को बनाकर पूरा किया जाता है। दूसरी तरफ आप class A की कार्यक्षमता का केवल एक हिस्सा उपयोग करना चाहते हैं ताकि आप (बच्चे के रूप में) पर सिस्टम के बीच युग्मन या कार्यान्वयन निर्भरता को कम करें और डुप्लीकेट को रोकें।

लेकिन जब आप आंतरिक कक्षा को परिभाषित करते हैं तो ध्यान रखें, आंतरिक कक्षाओं के बिना कोड अधिक रखरखाव और पठनीय है। जब आप बाहरी वर्ग के निजी डेटा सदस्यों तक पहुंचते हैं, तो जेडीके कंपाइलर निजी वर्ग तक पहुंचने के लिए आंतरिक वर्ग के लिए बाहरी वर्ग में पैकेज-एक्सेस सदस्य फ़ंक्शन बनाता है। यह एक सुरक्षा छेद छोड़ देता है। आम तौर पर हमें आंतरिक कक्षाओं का उपयोग करने से बचना चाहिए। आंतरिक वर्ग का केवल तभी उपयोग करें जब एक आंतरिक वर्ग बाहरी वर्ग और/या आंतरिक वर्ग के संदर्भ में केवल प्रासंगिक हो, निजी हो सकता है ताकि केवल बाहरी वर्ग इसे एक्सेस कर सके। आंतरिक कक्षाएं मुख्य रूप से इटरेटर्स, तुलनात्मक आदि जैसे सहायक वर्गों को लागू करने के लिए उपयोग की जाती हैं जिनका उपयोग बाहरी वर्ग के संदर्भ में किया जाता है। abstract class के बारे में, यह मददगार के लिए सार होना चाहिए, मान लीजिए कि आपके सहायक उनके लिए सार फ़ॉर्म लिखने के लिए बहुत जटिल होना चाहिए।

आपके मामले में, मुझे नेस्टेड अमूर्त कक्षाओं का व्यापक उपयोग याद नहीं है, शायद Swing दुनिया में।

+0

क्या आप मुझे कुछ वेबसाइट या पुस्तक लिंक दे सकते हैं! – sunleo

+0

@sunleo आप Google नेस्टेड/आंतरिक कक्षा के उपयोग में खोज करने का प्रयास कर सकते हैं क्योंकि यह जावा दुनिया में उपयोग छुपा नहीं है। आम तौर पर हमें आंतरिक कक्षाओं का उपयोग करने से बचना चाहिए। –

3

अमूर्त वर्गों का उपयोग विरासत के लिए कक्षा का आंशिक कार्यान्वयन प्रदान करने के लिए किया जाता है। यह आपको पूर्ण परिभाषा प्रदान किए बिना कक्षा की योजना को परिभाषित करने की अनुमति देता है, ताकि इसे बाल वर्ग में निर्दिष्ट किया जा सके। यह कुछ हद तक एक इंटरफेस की तरह काम करता है जिसमें आप अमूर्त वर्ग में निर्दिष्ट किसी भी वर्ग के उदाहरण पर किसी भी ऑपरेशन को निष्पादित कर सकते हैं। नेस्टेड सारणीबद्ध वर्गों को अन्य आंतरिक वर्गों (यहां तक ​​कि अज्ञात भी मुझे लगता है) द्वारा विरासत में प्राप्त करने के लिए डिज़ाइन किया गया है, लेकिन बाहरी वर्ग के बाहर परिभाषित कक्षाओं द्वारा नहीं।

public class HelloEveryone{ 
    abstract class Hello{ 
     void SayHello(){ 
      System.out.println("Hello!"); 
     } 

     abstract void SayHelloAlt(); 
    } 

    public class HelloWorld extends Hello{ 
     public void SayHelloAlt(){ 
      System.out.println("HelloWorld!"); 
     } 
    } 

    public class HelloUniverse extends Hello{ 
     public void SayHelloAlt(){ 
      System.out.println("HelloUniverse!"); 
     } 
    } 

    void Go(){ 
     ArrayList<Hello> hellos = new ArrayList<Hello>(); 
     hellos.add(new HelloWorld()); 
     hellos.add(new HelloUniverse()); 


     for (Hello h : hellos){ 
      h.SayHello(); 
      h.SayHelloAlt(); 
     } 
    } 

} 

static void main(){ 
    HelloEveryone hello = new HelloEveryone(); 
    hello.Go(); 
} 
+0

यह घोंसला सार सारणी नहीं है, यह सरल सार वर्ग – sunleo

+0

अच्छा बिंदु है। उदाहरण बदल गया। प्रिंसिपल वही है, लेकिन दिखाता है कि आंतरिक सार वर्गों को केवल अन्य आंतरिक वर्गों से विरासत में मिलाया जाता है। –

+0

लेकिन वहां कोई नेस्टेड अमूर्त वर्ग – sunleo