2010-07-27 13 views
6

मैंने चारों ओर देखा है और कोई भी सवाल नहीं मिला।विकिपीडिया का कहना है कि "पॉलिमॉर्फिज्म विधि ओवरलोडिंग या विधि ओवरराइडिंग जैसा नहीं है।"

बहुरूपता विधि से अधिक भार या विधि अधिभावी के समान नहीं है:

यहाँ पैरा मैं Wikipedia से मिल गया है। पॉलिमॉर्फिज्म केवल एक इंटरफ़ेस या अधिक सामान्य आधार वर्ग के लिए विशिष्ट कार्यान्वयन के अनुप्रयोग से संबंधित है। विधि ओवरलोडिंग उन विधियों को संदर्भित करती है जिनके समान नाम होते हैं लेकिन एक ही कक्षा के अंदर अलग-अलग हस्ताक्षर होते हैं। विधि ओवरराइडिंग है जहां एक सबक्लास अपने माता-पिता के तरीकों के एक या अधिक कार्यान्वयन को प्रतिस्थापित करता है। न तो विधि ओवरलोडिंग और न ही विधि ओवरराइडिंग स्वयं पॉलिमॉर्फिज्म के कार्यान्वयन हैं।

क्या कोई यहां इसे और अधिक स्पष्ट रूप से समझा सकता है, विशेष रूप से "पॉलिमॉर्फिज्म विधि ओवरराइडिंग जैसा नहीं है"? अब मैं भ्रमित हूं। अग्रिम में धन्यवाद।

+1

बीटीडब्ल्यू, खराब शीर्षक। आपको इसे फिर से लिखना चाहिए "पॉलिमॉर्फिज्म और विधि ओवरराइडिंग/ओवरलोडिंग के बीच क्या अंतर है" =) –

+1

ध्यान दें कि इस प्रश्न में उद्धरण (2010 से) अब लेख (2014) में नहीं है। इस आलेख में अब * विज्ञापन हॉक पॉलीमोर्फिज्म * पर एक अलग सेक्शन है, जो कि पॉलिफोर्फिज्म का एक वर्ग है जिसमें फ़ंक्शन ओवरलोडिंग शामिल है। – DaoWen

उत्तर

6

बहुरूपता (बहुत बस कहा) एक व्युत्पन्न वर्ग जहां एक आधार वर्ग की उम्मीद है उपयोग करने के लिए एक संभावना है: दूसरी ओर

class Base { 

} 

class Derived extends Base { 

} 

Base v = new Derived(); // OK 

विधि अधिभावी, है, जैसा कि विकी एक का कहना है एक व्युत्पन्न वर्ग में विधि व्यवहार को बदलने के रास्ते के लिए:

class Shape { 
    void draw() { /* Nothing here, could be abstract*/ } 
} 

class Square extends Shape { 
    @Override 
    void draw() { /* Draw the square here */ } 
} 

ओवरलोडिंग विरासत से संबंधित नहीं है तो उसका नाम वही है कि केवल तर्क वे ले में मतभेद के साथ और अधिक कार्यों को परिभाषित करने की अनुमति देता है।

+0

बहुत बहुत धन्यवाद! मैंने फिर से उस लेख को पढ़ लिया है और अब सबकुछ स्पष्ट है। –

1

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

किसी विधि को ओवरलोड करना कुछ और है, इसका मतलब है कि एक ही विधि का उपयोग पैरामीटर की एक अलग मात्रा के साथ करना है।

इस (ओवरराइडिंग) का संयोजन, साथ ही बेस क्लास या इंटरफेस का उपयोग करने की संभावना और अभी भी श्रृंखला को कहीं ऊपर एक ओवर्रिडेन विधि कहते हैं, जिसे पॉलिमॉर्फिज्म कहा जाता है।

उदाहरण:

interface IVehicle 
{ 
    void Drive(); 
} 

class Car : IVehicle 
{ 
    public Drive() { /* drive a car */ } 
} 

class MotorBike : IVehicle 
{ 
    public Drive() { /* drive a motorbike */ } 
} 

class Program 
{ 
    public int Main() 
    { 
     var myCar = new Car(); 
     var myMotorBike = new MotorBike(); 
     this.DriveAVehicle(myCar);  // drive myCar 
     this.DriveAVehicle(myMotorBike); // drive a motobike 
     this.DriveAVhehicle();   // drive a default car 
    } 

    // drive any vehicle that implements IVehicle 
    // this is polymorphism in action 
    public DriveAVehicle(IVehicle vehicle) 
    { 
     vehicle.Drive(); 
    } 

    // overload, creates a default car and drives it 
    // another part of OO, not directly related to polymorphism 
    public DriveAVehicle() 
    { 
     // typically, overloads just perform shortcuts to the method 
     // with the real implemenation, making it easier for users of the class 
     this.DriveAVehicle(new Car()); 
    } 
} 
+0

मुझे नहीं लगता कि polymorphisme = अधिभार + ओवरराइडिंग, अधिभार वास्तव में गैर-ऑब्जेक्ट उन्मुख संबंधित है। आप सी –

+0

@ क्लेमेंट का उपयोग करके ओवरलोडिंग कर सकते हैं: मुझे लगता है कि उसकी अंतिम वाक्य को शायद ही कभी खराब कहा जा सकता है (मुझे लगता है कि "यह" ओवरराइडिंग पर लागू करने का इरादा था, ओवरलोडिंग नहीं)। –

+0

@ क्लेमेंट/@ एडम: आप दोनों सही हैं: ओवरलोडिंग ओओ की मूल अवधारणा है (लेकिन गैर-ओओ लैंगुग्स की भी, ओओएससी पृष्ठ 95 की जांच करें), लेकिन प्रतिरूप पॉलिमॉर्फिज्म नहीं है। हालांकि, बहुरूपता के मुद्दों को हल करते समय भाषा कार्यान्वयनकर्ताओं को ओवरलोडिंग संकल्पों से निपटना होगा। मैंने अस्पष्टता को हटा दिया। – Abel

2

बहुरूपता तरीकों अधिरोहित जा रहा है के बारे में नहीं है, यह ऑब्जेक्ट्स किसी विशेष प्रक्रिया के कार्यान्वयन को निर्धारित करने के बारे में है। एक आसान उदाहरण - लेकिन किसी भी तरह से एकमात्र उदाहरण नहीं है - विरासत के साथ है:

एक उपन्यास एक प्रकार का पुस्तक है। इसमें अधिकांश विधियां हैं, और एक पुस्तक में आप जो कुछ भी कर सकते हैं वह नोवेल के साथ भी किया जा सकता है। इसलिए, कोई भी विधि जो किसी पुस्तक को तर्क के रूप में स्वीकार करती है, वह उपन्यास के साथ एक तर्क के रूप में भी निपट सकती है। (उदाहरण में शामिल होगा .read(), .write(), .burn())। यह है, प्रति से, इस तथ्य का जिक्र नहीं कि एक उपन्यास एक पुस्तक विधि को ओवरराइट कर सकता है। इसके बजाय, यह अमूर्त की सुविधा का जिक्र कर रहा है। यदि एक प्रोफेसर पढ़ने के लिए एक पुस्तक निर्दिष्ट करता है, तो उसे परवाह नहीं है कि आप इसे पढ़ते हैं - बस आप ही करते हैं। इसी तरह, एक कॉलिंग प्रोग्राम परवाह नहीं करता है प्रकार की एक वस्तु पुस्तक को पढ़ा जाता है, बस यही है। यदि वस्तु उपन्यास है, तो इसे उपन्यास के रूप में पढ़ा जाएगा। यदि यह उपन्यास नहीं है लेकिन अभी भी एक पुस्तक है, तो इसे एक पुस्तक के रूप में पढ़ा जाएगा।

पुस्तक:

private void read(){ 

#Read the book. 
} 

उपन्यास:

private void read(){ 

#Read a book, and complain about how long it is, because it's a novel! 

} 

ओवरलोडिंग तरीकों सिर्फ एक ही नाम है, लेकिन तर्क की एक अलग संख्या के साथ दो विधियों होने के लिए बात कर रहा है।उदाहरण:

writeNovel(int numPages, String name) 

writeNovel(String name) 
2

ओवरलोडिंग एक ही कक्षा में, एक ही नाम के साथ कई विधियों, लेकिन differents पैरामीटर है।

उत्तराधिकारी विरासत में, एक ही विधि + आधार वर्ग के पैरामीटर में है। इस प्रकार, वस्तु के वर्ग के आधार पर, या तो आधार विधि, या विरासत विधि कहा जाएगा।

पॉलिमॉर्फिज्म यह तथ्य है कि, एक विरासत वर्ग का एक उदाहरण बेस क्लास के उदाहरण को प्रतिस्थापित कर सकता है, जब पैरामीटर के रूप में दिया जाता है।

उदा। :

class Shape { 
    public void draw() { 
    //code here 
    } 
    public void draw(int size) { 
    //this is overloading 
    } 
} 

class Square inherits Shape { 
    public void draw() { 
    //some other code : this is overriding 
    } 

    public void draw(color c) { 
    //this is overloading too 
    } 
} 

class Work { 
    public myMethod(Shape s) { 
    //using polymophism, you can give to this method 
    //a Shape, but also a Square, because Square inherits Shape. 
    } 
} 

इसे देखें? पॉलिमॉर्फिंग तथ्य यह है कि, एक ही वस्तु का उपयोग अपनी कक्षा, इसकी बेस क्लास, या यहां तक ​​कि एक इंटरफ़ेस के उदाहरण के रूप में भी किया जा सकता है।

+0

तथ्य के एक बिंदु के रूप में, एक ही कक्षा में ओवरलोडिंग नहीं होनी चाहिए (बाल कक्षाएं अतिरिक्त ओवरलोड को परिभाषित करने के लिए स्वतंत्र हैं)। –

+0

@ एडम रॉबिन्सन: हाँ आप सही हैं, मैं इसे स्पष्ट करने के लिए अद्यतन करता हूं। –

3

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

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

1

पॉलिमॉर्फिज्म इस तथ्य को संदर्भित करता है कि एक प्रकार का एक उदाहरण किसी भी सुपरटेप के किसी भी उदाहरण की तरह ही इलाज किया जा सकता है। पॉलीमोर्फिज्म का अर्थ है 'कई रूप'।

कहें कि आपके पास कुत्ते नाम का एक प्रकार था। फिर आपके पास स्पैनियल नामक एक प्रकार है जो कुत्ते से विरासत में मिलता है। जहां भी कुत्ते का उपयोग किया जाता है, स्पैनियल का एक उदाहरण इस्तेमाल किया जा सकता है - इसका इलाज किसी भी अन्य कुत्ते के उदाहरण के समान किया जा सकता है। यह बहुरूपता है।

विधि ओवरराइडिंग एक वर्ग वर्ग में विधियों के लिए उप-वर्ग क्या कर सकता है। कुत्ते में छाल विधि हो सकती है। अधिक विशिष्ट कार्यान्वयन प्रदान करने के लिए स्पैनियल उस विधि को ओवरराइड कर सकता है। ओवरराइडिंग विधियां पॉलिमॉर्फिज्म को प्रभावित नहीं करती हैं - तथ्य यह है कि आपने स्पैनियल में एक कुत्ते विधि को ओवरराइड किया है, यह आपको कुत्ते की तरह स्पैनियल के इलाज से रोकने में सक्षम नहीं करता है।

विधि अधिभार केवल विभिन्न विधियों को देने का कार्य है जो अलग-अलग पैरामीटर समान नाम लेते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है।

1

सच कहूं:

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

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