2011-06-29 13 views
5

मेरे पास "प्लेसपार्सर" नामक एक कक्षा में एक विधि है जो extends "ModelParser":जावा: ओवरराइडिंग या ओवरलोडिंग विधि?

protected Place parseModel(JSONObject element) ... 

ए प्लेस मॉडल का एक उप वर्ग है। क्या @Override एनोटेशन उपरोक्त कोड में जोड़ा जाना चाहिए? चूंकि विधि के पास एक अलग रिटर्न प्रकार है, क्या यह अभी भी समान श्रेणी और तर्क के साथ बेस क्लास विधि को ओवरराइड करने के रूप में गिना जाता है/क्या रिटर्न प्रकार 'हस्ताक्षर' को बदलता है?

"मॉडलपार्स" विधि इस "मॉडलटी" की तरह दिखती है "मॉडल" भी फैली हुई है:

protected abstract ModelT parseModel(JSONObject element) 
      throws JSONException; 

अद्यतन @ जोन स्कीट:

बेस क्लास इस तरह घोषित किया गया है:

public abstract class ModelParser<ModelT extends Model> { 

मैंने पहले कक्षा के लिए <ModelT extends Model> शैली घोषणा नहीं देखी थी।

+0

http://stackoverflow.com/questions/1882584/what-is-a-covariant-return-type देखें। (नहीं * बिल्कुल * आपका मामला, क्योंकि 'प्लेस' 'मॉडलटी' का विस्तार नहीं करता है।) –

+0

@Eli: मुझे संदेह है कि प्लेस वास्तव में मॉडलटी को बढ़ाता है, अन्यथा यह कोड संकलित नहीं होगा। (या मॉडलटी एक सामान्य प्रकार पैरामीटर है ...) –

+0

@ जोन: मैंने सवाल अपडेट किया है - यदि आप 'मॉडलटी' और' प्लेस 'के बीच संबंधों को समझा सकते हैं तो मैं बहुत आभारी हूं। – Mikaveli

उत्तर

6

हां, आपको @Override जोड़ना चाहिए, क्योंकि आप अभी भी विधि को ओवरराइड कर रहे हैं। तथ्य यह है कि आप रिटर्न प्रकारों के कॉन्वर्सिस का उपयोग कर रहे हैं, वह उसमें बदलाव नहीं करता है।

विशेष रूप से, यदि अन्य कोड प्रकार ModelParser की अभिव्यक्ति है और कहता है parseModel(element) वे अभी भी ऊपर polymorphically अपने कार्यान्वयन में खत्म हो जाएगा। तुलना करें ओवरलोडिंग (उदाहरण के लिए एक और पैरामीटर जोड़कर) जहां ModelParser में मूल कार्यान्वयन कहा जाएगा।

3

जावा, कई प्रोग्रामिंग भाषाओं के साथ, आपको एक विधि के लिए विधि विधि का पुन: उपयोग करने की अनुमति देता है। कुछ परिस्थितियों में, आप एक ही कक्षा में कई विधियों को लिखना चाह सकते हैं जो मूल रूप से अलग-अलग तर्कों के साथ एक ही काम करते हैं। जब आप एक विधियों को कॉल करने के लिए कोड लिखते हैं, तो उपयुक्त एक को तर्क या तर्क के प्रकार के अनुसार चुना जाता है। दो नियमों अतिभारित तरीकों पर लागू होते हैं:

  1. तरीकों की वापसी प्रकार अलग हो सकता है, लेकिन अतिभारित तरीकों में से तर्क सूचियों अलग करना होगा।
  2. कॉलिंग कथन की तर्क सूचियों को कॉल करने के उचित तरीके के स्पष्ट निर्धारण की अनुमति देने के लिए पर्याप्त भिन्न होना चाहिए।

अधिभावी वर्ग पदानुक्रम में, जब एक उप कक्षा में एक तरीकों सुपर क्लास में विधि के रूप में एक ही नाम और प्रकार हस्ताक्षर हैं, तो उपवर्ग में विधि सुपर क्लास में विधि ओवरराइड करने के लिए कहा जाता है। व्युत्पन्न वर्ग में विधियों का आधार वर्ग के समान नाम हो सकता है। यदि आपके पास पुस्तक नामक एक आधार श्रेणी है और बुक 1 और बुक 2 नामक कक्षा को प्राप्त किया गया है और यदि आप सभी तीन वर्गों में समान विधियों का उपयोग करते हैं, तो अंतिम व्युत्पन्न क्लास विधि निष्पादित की जाती है हालांकि सभी पूर्व वर्गों में समान नामों के तरीके हैं। जावा में अवधारणा को ओवरराइडिंग कहा जाता है।

3

1) विधि अधिभार और ओवरराइडिंग के बीच पहला और सबसे महत्वपूर्ण अंतर यह है कि, जावा में विधि अधिभार के मामले में, विधि ओवरराइडिंग के मामले में विधि परिवर्तन का हस्ताक्षर समान रहता है।

2) जावा में ओवरराइडिंग विधि ओवरलोडिंग के बीच दूसरा बड़ा अंतर यह है कि आप एक वर्ग में अधिभार विधि को अधिभारित कर सकते हैं लेकिन ओवरराइडिंग केवल उप-वर्ग पर ही की जा सकती है।

3) आप जावा में स्थिर, अंतिम और निजी विधि को ओवरराइड नहीं कर सकते हैं लेकिन आप जावा में स्थिर, अंतिम या निजी विधि को अधिभारित कर सकते हैं।

4) जावा में ओवरलोडेड विधि स्थिर बाध्यकारी और ओवरराइड विधियों से बंधी है गतिशील बाध्यकारी के अधीन हैं।

5) जावा में निजी और अंतिम विधि भी ओवरराइड नहीं की जा सकती है। enter image description here

और अधिक पढ़ें: http://javarevisited.blogspot.com/2011/12/method-overloading-vs-method-overriding.html#ixzz3TbRYYM5z

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