2011-07-07 11 views
9

मुझे उत्सुकता है कि अमूर्त तरीकों को पहले ठोस कार्यान्वयन वर्ग द्वारा क्यों अधिलेखित किया जाना चाहिए, और पदानुक्रम में बदलाव के बाद कोई भी नहीं।पहली कंक्रीट कक्षा द्वारा अमूर्त तरीकों को लागू क्यों किया जाना चाहिए, और श्रृंखला के नीचे एक और क्यों नहीं?

मैं सुझाव दे नहीं कर रहा हूँ मैं ऐसा करना चाहते हैं, लेकिन मैं क्यों यह प्रथम श्रेणी

घोषणा के बिना इस उदाहरण

abstract class Upper 
{ 
    abstract void doSomething(); 
} 

class Middle extends Upper 
{ 
    void doSomething() 
    { 
     // I'm forced to be implemented here 
    } 
} 

abstract class Lower extends Middle 
{ 

} 

class Bottom extends Lower 
{ 
    void doSomething() 
    { 
     // I'm valid, but I'm too far down the hierarchy 
    } 
} 
+3

शायद क्योंकि ठोस वर्गों में अमूर्त विधियां नहीं हो सकती हैं। केवल 'अमूर्त' वर्गों में 'अमूर्त' विधियां हो सकती हैं ... मुझे समझ में आता है। –

उत्तर

24

परिभाषा के अनुसार एक सामान्य वर्ग को सभी अमूर्त तरीकों को लागू करना होगा। यदि आप मध्य अमूर्त घोषित करेंगे, तो आपको मध्य में विधियों को लागू नहीं करना पड़ेगा।

एक सामान्य वर्ग को तत्काल किया जा सकता है, जबकि एक सार वर्ग नहीं हो सकता है। इस बारे में सोचें कि क्या होगा यदि आप उन तरीकों को कॉल करने का प्रयास करते हैं जो कक्षा में लागू नहीं हैं।

0

अपने उदाहरण में विचार करें हो गया है के रूप में उत्सुक हूँ मध्य में कुछ चलने के लिए कोई कोड नहीं होगा। इसलिए कक्षा को अमूर्त होना होगा।

0

यह वास्तव में का प्रश्न नहीं है होना चाहिए। एक अमूर्त कक्षा केवल एक वर्ग है जिसमें कार्यान्वयन के बिना एक या अधिक विधियां हैं।

यह एक जैविक मानव पुरुष कहने की तरह है एक वाई गुणसूत्र होना चाहिए। यह एक कानून नहीं है; यह परिभाषा का सिर्फ एक हिस्सा है।

अपने उदाहरण में, यदि आप Middle में doSomething लागू करने के लिए नहीं करना चाहते हैं, तो आप वास्तव में नहीं Middleठोस होना चाहता हूँ। यही है, इसमें एक विधि होगी जिसमें कोई परिभाषा नहीं है। तो यह सार है।

आप निश्चित रूप से इसे एक खाली कार्य के रूप में कार्यान्वित कर सकते हैं जो कुछ भी नहीं करता है। आप जो भी पूछ रहे हैं उसके करीब यह बहुत करीब है, मुझे विश्वास है।

वास्तव में यह शब्दावली का सिर्फ एक प्रश्न है। यदि अनुपूरक सदस्य हैं, तो प्रकार का सार। यह इत्ना आसान है।

3

यदि मध्य एक ठोस वर्ग है, तो एक तत्काल संस्करण जो एक अमूर्त विधि को परिभाषित नहीं करता है, कॉल करने योग्य नहीं होगा (क्योंकि इसमें कोई परिभाषा नहीं है)। यह मूल रूप से मध्य को एक अमूर्त वर्ग भी बना देगा।

6

कंक्रीट कक्षाएं ठोस हैं।
जिसका अर्थ है कि उन्हें प्रारंभ और उपयोग करने में सक्षम होना चाहिए।
तो, यदि आप विधियों को लागू नहीं करते हैं, तो इसका सही तरीके से उपयोग कैसे किया जाएगा? यह अपूर्ण होगा और इस तरह ठोस नहीं होगा।

आप एक और सार वर्ग को एक अमूर्त वर्ग का उत्तराधिकारी बना सकते हैं।

2

क्योंकि आपके पास सारणी में सार तत्व नहीं हो सकते हैं जो सार नहीं है। यदि आप किसी भी तरीके की आवश्यकता नहीं चाहते हैं, तो आपको उस वर्ग को बढ़ाने की आवश्यकता नहीं है।

इसके बजाय, बस class Lower extend Upper है।

यदि आप अभी भी Lower चाहते हैं तो Middle से अमूर्त विधियों और उत्तराधिकारी दोनों का उत्तराधिकारी हो, बस Middle को सार के रूप में घोषित करें।

4

बस एक Middle एक अमूर्त वर्ग बनाओ, और यह ठीक है।

आप रखने के लिए एक ठोस वर्ग के रूप में Middle लेकिन भी इसे से doSomething को दूर चाहते हैं, कृपया समझाएं कि आप इस कोड को क्या करना चाहते हैं चाहते हैं:

Upper x = new Middle(); 
x.doSomething(); 
1

आप doSomething को लागू करने के लिए मजबूर कर रहे हैं Middle में, क्योंकि मध्य एक ठोस वर्ग है। इसका मतलब है कि Middle को अपने सुपरक्लास से सभी अमूर्त विधियों के कार्यान्वयन के साथ-साथ इंटरफेस से किसी भी इंटरफ़ेस विधियों के कार्यान्वयन को कार्यान्वित करना होगा।

यदि आपने Middle को एक सार वर्ग के रूप में चिह्नित किया है, तो आप doSomething को Bottom पर कार्यान्वित कर सकते हैं।

अमूर्त कक्षाओं के बारे में अधिक जानकारी के लिए, Java Language Specification से यह लिंक देखें।

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

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