2008-09-24 8 views
28

... या वे एक ही बात हैं? मुझे लगता है कि प्रत्येक का अपना विकिपीडिया प्रविष्टि है नोटिस: [[1]] (http://en.wikipedia.org/wiki/Polymorphism_(computer_science))[2], लेकिन मैं मुसीबत को देखकर कैसे अवधारणाओं अलग हो रही हैपॉलिमॉर्फिज्म और एकाधिक डिस्पैच के बीच क्या अंतर है?

संपादित करें:।? और कैसे यह सब में Overloading फिट करता है

उत्तर

38

बहुरूपता सुविधा एक भाषा/कार्यक्रम क्रम कि विधि के लिए भेजा मापदंडों के प्रकार के आधार पर लागू करने की जो पद्धति पर के दौरान निर्णय लेने के लिए अनुमति देता है।

भाषा/क्रम द्वारा इस्तेमाल किया पैरामीटर की संख्या बहुरूपता का 'प्रकार' एक भाषा के द्वारा समर्थित निर्धारित करता है।

सिंगल डिस्पैच पॉलिमॉर्फिज्म का एक प्रकार है जहां कॉल का निर्धारण करने के लिए केवल एक पैरामीटर का उपयोग किया जाता है (संदेश का प्राप्तकर्ता - this, या self)।

एकाधिक प्रेषण बहुरूपता का एक प्रकार है, जहां कई मानकों में जो विधि कॉल करने का पता लगाने में किया जाता है। इस मामले में, विधि के साथ-साथ विधि पैरामीटर के प्रकार का उपयोग करने के लिए किस विधि को आमंत्रित करने के लिए उपयोग किया जाता है।

तो तुम कह सकते हैं कि बहुरूपता सामान्य शब्द है और कई और एकल प्रेषण बहुरूपता के विशिष्ट प्रकार के कर रहे हैं।

परिशिष्ट: संकलन समय के दौरान ओवरलोडिंग होती है। यह संकलन के दौरान उपलब्ध प्रकार की जानकारी का उपयोग करता है यह निर्धारित करने के लिए कि किस प्रकार की विधि कॉल करें। सिंगल/एकाधिक प्रेषण रनटाइम के दौरान होता है।

नमूना कोड:

using NUnit.Framework; 

namespace SanityCheck.UnitTests.StackOverflow 
{ 
    [TestFixture] 
    public class DispatchTypes 
    { 
     [Test] 
     public void Polymorphism() 
     { 
      Baz baz = new Baz(); 
      Foo foo = new Foo(); 

      // overloading - parameter type is known during compile time 
      Assert.AreEqual("zap object", baz.Zap("hello")); 
      Assert.AreEqual("zap foo", baz.Zap(foo)); 


      // virtual call - single dispatch. Baz is used. 
      Zapper zapper = baz; 
      Assert.AreEqual("zap object", zapper.Zap("hello")); 
      Assert.AreEqual("zap foo", zapper.Zap(foo)); 


      // C# has doesn't support multiple dispatch so it doesn't 
      // know that oFoo is actually of type Foo. 
      // 
      // In languages with multiple dispatch, the type of oFoo will 
      // also be used in runtime so Baz.Zap(Foo) will be called 
      // instead of Baz.Zap(object) 
      object oFoo = foo; 
      Assert.AreEqual("zap object", zapper.Zap(oFoo)); 
     } 

     public class Zapper 
     { 
      public virtual string Zap(object o) { return "generic zapper" ; } 
      public virtual string Zap(Foo f) { return "generic zapper"; } 
     } 

     public class Baz : Zapper 
     { 
      public override string Zap(object o) { return "zap object"; } 
      public override string Zap(Foo f) { return "zap foo"; } 
     } 

     public class Foo { } 
    } 
} 
+0

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

+0

वहां आप जाते हैं। :) – jop

+8

उत्कृष्ट उत्तर! ए ++++++ फिर से पूछें – raldi

1

एकाधिक डिस्पैच पॉलिमॉर्फिज्म का एक प्रकार है। जावा/सी #/सी ++ में, विरासत और ओवरराइडिंग के माध्यम से बहुलकता है, लेकिन यह एकाधिक डिस्पैच नहीं है, जो कि 2 या अधिक तर्कों पर आधारित है (केवल यह, जावा में की तरह/सी #/सी ++)

1

एकाधिक डिस्पैच फ़ंक्शन ओवरलोडिंग के समान है (जैसा कि जावा/सी ++ में देखा गया), लागू किए गए फ़ंक्शन को छोड़कर तर्कों के रन-टाइम प्रकार पर निर्भर करता है, न कि उनके स्थिर प्रकार।

0

एकाधिक डिस्पैच polymorphism आधारित पर निर्भर करता है। सी ++, सी #, वीबी.नेट, आदि में सामना किया जाने वाला विशिष्ट बहुरूपता ... एकल प्रेषण का उपयोग करता है - यानी वह फ़ंक्शन जिसे केवल कॉल किया जाता है, केवल एक वर्ग उदाहरण पर निर्भर करता है। एकाधिक प्रेषण एकाधिक कक्षा के उदाहरणों पर निर्भर करता है।

2

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

पॉलिमॉर्फिज्म अनिवार्य रूप से अवधारणा है कि किसी वस्तु को किसी भी प्रकार के रूप में देखा जा सकता है जो कि आधार है। तो यदि आपके पास कार और ट्रक है, तो वे दोनों को वाहन के रूप में देखा जा सकता है। इसका मतलब है कि आप किसी भी वाहन विधि को किसी एक के लिए कॉल कर सकते हैं।

एकाधिक प्रेषण समान दिखता है, जिसमें यह आपको कई प्रकार के तर्कों के साथ विधियों को कॉल करने देता है, हालांकि मुझे विवरण में कुछ आवश्यकताएं नहीं दिखाई देती हैं। सबसे पहले, यह एक सामान्य आधार प्रकार की आवश्यकता नहीं प्रतीत होता है (ऐसा नहीं है कि मैं इसे बिना शून्य के कार्यान्वित करने की कल्पना कर सकता हूं *) और आपके पास कई ऑब्जेक्ट्स शामिल हो सकते हैं।

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

यदि अच्छा() विधि अलग-अलग तर्कों के साथ कॉल करने की आवश्यकता होती है तो यह अच्छा हो सकता है। हो सकता है कि Car.Start (कुंजी carKey) बनाम Missile.Start (पूर्णांक launchCode)

लेकिन दोनों StartObject (theCar) या StartObject के रूप में कहा जा सकता है (theMissile)

दिलचस्प अवधारणा ...

1

अगर यदि आप एक विधि मंगलाचरण

(obj_1, obj_2, ..., obj_n)->method 

टपल में प्रत्येक विशिष्ट प्रकार पर निर्भर करने के लिए के वैचारिक बराबर है, तो आप एक से अधिक प्रेषण चाहते हैं। पॉलिमॉर्फिज्म मामले n = 1 से मेल खाता है और ओओपी की एक आवश्यक विशेषता है।

3

एकाधिक प्रेषण के साथ, एक विधि में कई तर्क पारित किए जा सकते हैं और कौन सा कार्यान्वयन उपयोग किया जाता है प्रत्येक तर्क के प्रकार पर निर्भर करता है। जिस प्रकार का मूल्यांकन किया जाता है वह आदेश भाषा पर निर्भर करता है। एलआईएसपी में, यह प्रत्येक प्रकार को पहले से आखिरी तक जांचता है। एकाधिक प्रेषण वाली भाषाएं जेनेरिक फ़ंक्शंस का उपयोग करती हैं, जो केवल फ़ंक्शन डेलरेशन हैं और जेनेरिक विधियों की तरह नहीं हैं, जो टाइप पैरामीटर का उपयोग करती हैं।

एकाधिक प्रेषण विधि कॉल के लिए तर्कों की subtyping polymorphism के लिए अनुमति देता है।

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

इसके अलावा, जेनरिक पैरामीट्रिक प्रकार बहुरूपता (जैसे, एक ही सामान्य इंटरफ़ेस सूची < की तरह, विभिन्न प्रकार के साथ उपयोग करने के लिए भले ही वे संबंधित नहीं कर रहे हैं, टी> प्रदान करते हैं - यह किसी भी प्रकार की एक सूची हो सकता है और परवाह किए बिना उसी तरह प्रयोग किया जाता है)।

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