2009-01-06 15 views
10

मेरे पास कक्षा बी है, जो कक्षा ए से विरासत में है। सुपरक्लास ए सार है, जिसमें एक सार विधि है। मैं कक्षा बी में अमूर्त विधि को लागू नहीं करना चाहता, इसलिए मुझे कक्षा बी को सार के रूप में घोषित करने की आवश्यकता है। कक्षा बी सारणी घोषित करना, दो चीजें मेरे लिए काम कर रही हैं (प्रोग्राम संकलित और सही ढंग से चलते हैं):जावा में सार कक्षाएं और विधियां, विरासत

1.) मैं कक्षा बी में किसी भी अमूर्त विधियों की घोषणा नहीं करता हूं, यहां तक ​​कि यह भी माना जाता है कि कक्षा सार है। यह काम करता है, मुझे लगता है, क्योंकि कक्षा कक्षा ए के अमूर्त तरीके को विरासत में लेती है, और कक्षा के लिए सार के रूप में घोषित करने के लिए यह पर्याप्त है: हमें कक्षा में सीधे घोषित किसी भी अन्य अमूर्त विधियों की आवश्यकता नहीं है।

2.) मैं कक्षा बी में एक ही सार विधि घोषित करता हूं क्योंकि इसे कक्षा ए में घोषित किया गया है। यह किसी प्रकार का ओवरराइडिंग (?) है, जैसा कि जावा में ओवरराइडिंग के समान नहीं है (उसी हेडर का उपयोग करके, लेकिन विभिन्न कार्यान्वयन प्रदान करते हैं), यहां मैं बस विधि के समान हेडर का उपयोग करता हूं।

दोनों चीजें काम कर रही हैं, और मुझे यकीन नहीं है कि वे दोनों ठीक हैं या नहीं, और उनमें से कुछ को प्राथमिकता दी जाती है (अन्य सही)। क्या दो तरीके समान हैं (क्या वे जावा के समान हैं)?

यहाँ मैं, कुछ उदाहरण कक्षाएं दे तो क्या मेरा मतलब है आप के लिए और अधिक स्पष्ट है कि:

केस 1.):

public abstract class A { 
    public abstract String giveSum(); 
} 

public abstract class B extends A { 

} 

प्रकरण 2.):

public abstract class A { 
    public abstract String giveSum(); 
} 

public abstract class B extends A { 
    public abstract String giveSum(); 
} 

सादर

उत्तर

8

वे कार्यात्मक रूप से बराबर हैं, लेकिन पहले व्यक्ति को प्राथमिकता दी जाती है क्योंकि यह छोटा है और अजीब नहीं है।

+1

"पाठक को भ्रमित नहीं करता है कि" अजीब नहीं है "के बजाय" एक नई विधि परिभाषित की जा रही है "के बारे में कैसे? ;-) –

+0

"अजीब नहीं है" छोटा है :-) –

2

# 1 के साथ जाएं। बाल वर्ग में विधि घोषणा को पुनर्विचार करना भ्रमित है। और आपको वास्तव में एक अमूर्त वर्ग में किसी भी अमूर्त विधियों की आवश्यकता नहीं है, भले ही माता-पिता अमूर्त हों या नहीं।

+0

लेकिन क्या वर्ग को सार के रूप में घोषित करने के लिए यह समझ में आता है, अगर वर्ग में कोई सार विधि घोषित नहीं की जाती है (और कक्षा को अमूर्त वर्ग से प्राप्त नहीं होता है?) – user42155

+0

आह, जेरेड द्वारा पोस्ट इस प्रश्न का उत्तर नीचे दिया गया है। – user42155

2

तो सवाल यह है कि जब जावा में एक अमूर्त वर्ग को वर्गीकृत करते हैं और कार्यान्वयन प्रदान नहीं करना चाहते हैं तो कौन सा प्राथमिकता दी जाती है?

एक) मार्क उपवर्ग सार सार भी और विधि हस्ताक्षर सार के रूप में चिह्नित फिर से लिखें के रूप में भी

ख) निशान उपवर्ग के रूप में?

मैं पहली बार एक के लिए जाना होगा:

एक) मार्क सार रूप में भी उपवर्ग।

पूर्व में पहले से ही सार विधि घोषणा है, इसे दोहराने में कोई बात नहीं है।

35

जावा में, abstract कक्षा एनोटेशन इंगित करता है कि कक्षा को तुरंत चालू नहीं किया जा सकता है। एक वर्ग को abstract घोषित किया जा सकता है क्योंकि इसे कभी भी तत्काल नहीं किया जाना चाहिए (शायद इसमें केवल स्थिर विधियां हैं), या क्योंकि इसके उप-वर्गों को तत्काल चालू किया जाना चाहिए।

यह नहीं एक आवश्यकता है कि abstract कक्षाएं abstract तरीकों को शामिल है (इसका विपरीत सत्य है: एक या अधिक abstract तरीकों से युक्त abstract होना चाहिए एक वर्ग।)

कि क्या आप नकल करना चाहिए का सवाल अमूर्त विधि परिभाषा को स्टाइल प्रश्न के रूप में माना जा सकता है - लेकिन मुझे परिभाषा को डुप्लिकेट करने के पक्ष में तर्क के साथ आने के लिए कड़ी मेहनत की जाएगी (केवल एक ही तर्क जिसके साथ मैं आ सकता हूं उस मामले में जहां श्रेणी पदानुक्रम अर्थशास्त्र बदल सकता है या विधि का उपयोग, और इस प्रकार आप एक अतिरिक्त javado प्रदान करना चाहते हैं कक्षा बी में सी)

abstract विधि की पुन: परिभाषा के खिलाफ प्राथमिक तर्क यह है कि डुप्लिकेट कोड खराब है - यह अधिक बोझिल और इस तरह के सभी क्लासिक "कोड डुप्लिकेट नहीं करता" तर्क लागू करता है।)

1

आप सही हैं, दो मामले समकक्ष हैं। प्रकरण 1) अधिक सरल है, मामला 2) कोड डुप्लिकेशन है - इससे बचें। लेकिन ऐसा करने का एक कारण हो सकता है:

यदि कक्षा ए में विधि String वापस नहीं आती है, लेकिन कहें कि सी, कक्षा बी इसे अधिक विशिष्ट रिटर्न प्रकार के साथ (जावा 5 के बाद) ओवरराइड कर सकता है, तो कहें डी (वर्ग सी बढ़ाता है):

public abstract class A { 
    public abstract C giveSum(); 
} 

public abstract class B extends A { 
    public abstract D giveSum(); 
} 

public class C { 
    ... 
} 

public class D extends C { 
    ... 
} 
+0

http://en.wikipedia.org/wiki/Covariant_return_type। मुझे लगता है कि केवल जावा 1.5 में लागू किया गया है (http://java.sun.com/developer/JDCTechTips/2004/tt1201.html#2) – Chii

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