Frage

... oder sind sie die gleiche Sache? Ich bemerke, dass jeder seinen eigenen Wikipedia-Eintrag hat: Polymorphismus Multiple Dispatch-, aber ich habe Probleme zu sehen, wie die Konzepte unterscheiden.

Edit: Und wie Overloading in alles passen ?

War es hilfreich?

Lösung

Polymorphismus ist die Einrichtung, die eine Sprache / Programm, Entscheidungen zu treffen während der Laufzeit auf den Typen der Parameter, auf dem Verfahren diese Methode gesendet aufzurufen Basis ermöglicht.

Die Anzahl der Parameter, die von der Sprache / Laufzeit verwendet bestimmt den ‚Typ‘ des Polymorphismus durch eine Sprache unterstützt.

Single Dispatch ist eine Art von Polymorphismus in dem nur einen Parameter (der Empfänger der Nachricht - this oder self) verwendet wird. Den Anruf zu bestimmen

Multiple Dispatch ist eine Art von Polymorphismus in dem in mehreren Parameter verwendet werden, in der Bestimmung, welche Methode aufzurufen. In diesem Fall werden die Empfänger sowie die Art der Verfahrensparameter verwendet, welche Methode zu sagen, aufzurufen.

So Sie, dass Polymorphismus sagen können, ist der allgemeine Begriff und Mehrfach- und Einzelversand sind bestimmte Arten von Polymorphismus.

Nachtrag: Overloading während der Kompilierung geschieht. Es verwendet die Typinformationen während der Kompilierung zur Verfügung, um zu bestimmen, welche Art von Verfahren zu nennen. / Mehrere Versand erfolgt zur Laufzeit.

Beispielcode:

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 { }
    }
}

Andere Tipps

Mit mehreren Dispatch kann ein Verfahren haben mehrere Argumente an sie übergeben und welche Implementierung verwendet wird, hängt von jedem Typ Argument. Die Reihenfolge, dass die Arten ausgewertet werden, hängt von der Sprache. In LISP, überprüft er jede Art von Anfang bis Ende. Sprachen mit mehreren Dispatch Verwendung von generischen Funktionen machen, die Erklärungen nur Funktion sind und nicht generische Methoden wie, welche Art Parameter verwenden.

Multiple Dispatch ermöglicht Subtyping Polymorphismus von Argumenten für Methodenaufrufe .

Single Versand ermöglicht auch eine begrenztere Art von Polymorphismus (die gleiche Methode Namen für Objekte verwenden, die die gleiche Schnittstelle oder erben die gleiche Basisklasse implementieren). Es ist das klassische Beispiel für Polymorphismus, wo Sie Methoden, die in Unterklassen überschrieben werden.

Darüber hinaus, Generika bieten parametrischer Typ Polymorphismus (dh die gleiche generische Schnittstelle mit unterschiedlichen Typen zu verwenden, auch wenn sie nicht in Verbindung stehend - wie List<T>: kann es sich um eine Liste von jeder Art sein und wird auf die gleiche Art und Weise unabhängig verwendet wird).

Ich habe noch nie von Multiple Versand gehört, aber auf der Wikipedia-Seite nach einem Blick sieht es viel wie MD eine Art von Polymorphismus ist, wenn sie mit den Argumenten ein Verfahren verwendet.

Polymorphismus ist im Wesentlichen das Konzept, dass ein Objekt als jede Art zu erkennen, dass es Basis ist. Wenn Sie also eine Car und Truck haben, können sie sowohl als Vehicle zu sehen. Dies bedeutet, dass Sie jede Vehicle Methode für beide einen Anruf können.

Multiple Dispatch sieht ähnlich aus, dass es lässt Sie Methoden mit Argumenten mehrerer Typen nennen, aber ich sehe nicht, bestimmte Anforderungen in der Beschreibung. Erstens ist es nicht eine gemeinsame Basistyp erscheinen zu verlangen (nicht, dass ich das ohne void* Umsetzung vorstellen kann) und Sie können beteiligt mehrere Objekte haben.

Also anstatt die Start() Methode in einer Liste auf jedes Objekt aufzurufen (was einen klassischen Polymorphismus Beispiel ist), können Sie eine StartObject(Object C) Methode aufrufen, an anderer Stelle und Code definiert es das Argument Typ zur Laufzeit zu überprüfen und entsprechend behandeln. Der Unterschied besteht darin, dass die Start() Methode in der Klasse gebaut werden müssen, während die StartObject() Methode kann außerhalb der Klasse definiert werden, so dass die verschiedenen Objekte müssen nicht an eine Schnittstelle entsprechen.

Dies könnte schön sein, wenn die Start() Methode benötigt, um mit verschiedenen Argumenten aufgerufen werden. Vielleicht Car.Start(Key carKey) vs. Missile.Start(int launchCode)

Aber beide könnten als StartObject(theCar) oder StartObject(theMissile) aufgerufen werden

Interessantes Konzept ...

Multiple Dispatch eher an Funktion Überlastung (wie in Java / C ++ zu sehen ist), mit Ausnahme der Funktion ist abhängig von dem Laufzeittyp der Argumente aufgerufen, ihr statischer Typ.

Wenn Sie die konzeptuelle Äquivalent eines Methodenaufruf möchten

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

auf jedem spezifischen Typ in dem Tupel abhängen, dann mögen Sie mehrere Versand. Polymorphismus entspricht dem Fall, n = 1 und ist ein notwendiges Merkmal der OOP.

Mehrere Versand ist eine Art von Polymorphismus. In Java / C # / C ++, ist es Polymorphismus durch Vererbung und überwiegenden, aber das ist nicht möglich, mehr Dispatch, die auf zwei oder mehr Argumente basieren (und nicht nur this, wie in Java / C # / C ++)

Multiple Dispatch-stützt sich auf Polymorphismus basieren. Typischer Polymorphismus angetroffen in C ++, C #, VB.NET, etc ... verwendet Einzelversand - das heißt die Funktion, die nur von einer einzigen Klasseninstanz aufgerufen wird. Multiple Dispatch stützt sich auf mehrere Klasseninstanzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top