2008-09-24 7 views

Antwort

38

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

Die Anzahl der von der Sprache/Laufzeit verwendeten Parameter bestimmt den "Typ" des von einer Sprache unterstützten Polymorphismus.

Einzelversand ist eine Art von Polymorphie, bei der nur ein Parameter verwendet wird (der Empfänger der Nachricht - this oder self), um den Anruf zu bestimmen.

Mehrfachversendung ist eine Art von Polymorphie, bei der bei der Bestimmung der anzuzurufenden Methode mehrere Parameter verwendet werden. In diesem Fall wird der Empfänger sowie die Typen der Methodenparameter verwendet, um zu bestimmen, welche Methode aufgerufen werden soll.

So kann man sagen, dass Polymorphismus der allgemeine Begriff ist und Mehrfach- und Einzelversand bestimmte Arten von Polymorphismus sind.

Zusatz: Überladung passiert während der Kompilierzeit. Es verwendet die während der Kompilierung verfügbaren Typinformationen, um zu ermitteln, welche Methode aufgerufen werden soll. Single/Multiple Dispatch erfolgt während der 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 { } 
    } 
} 
+0

Dies ist eine ziemlich gute Antwort - wenn Sie kurze Codeschnipsel fügen Sie ein Beispiel von jedem zu zeigen, ich glaube, ich es als Antwort akzeptieren würde. – raldi

+0

Dort gehen Sie. :) – jop

+8

Hervorragende Antwort! A ++++++ würde von wieder – raldi

1

Multiple Dispatch ist eine Art von Polymorphismus.In Java/C#/C++ gibt es Polymorphismus durch Vererbung und Überschreibung, aber das ist nicht Multiple Dispatch, die auf 2 oder mehr Argumente basiert (nicht nur diese, wie in Java/C#/C++)

1

Multiple Dispatch ist eher der Funktionsüberlastung (als gesehen in Java/C++), außer dass die aufgerufene Funktion vom Laufzeittyp der Argumente abhängt, nicht vom statischen Typ.

0

Multiple Dispatch basiert auf Polymorphie basiert. Typischer Polymorphismus, der in C++, C#, VB.NET, usw. angetroffen wird, verwendet eine einzelne Verteilung - d. H. Die Funktion, die aufgerufen wird, hängt nur von einer einzelnen Klasseninstanz ab. Die Mehrfachversendung beruht auf mehreren Klasseninstanzen.

2

Ich habe noch nie von Multiple Dispatch gehört, aber nach einem Blick auf die Wikipedia-Seite sieht es sehr ähnlich wie MD ist eine Art von Polymorphie, wenn mit den Argumenten zu einer Methode verwendet.

Polymorphismus ist im Wesentlichen das Konzept, dass ein Objekt als jeder Typ, der es ist, gesehen werden kann. Also, wenn Sie ein Auto und einen LKW haben, können sie beide als ein Fahrzeug gesehen werden. Dies bedeutet, dass Sie für jede eine beliebige Vehicle-Methode aufrufen können.

Mehrere Versand sieht ähnlich, in dem Sie Methoden mit Argumenten von mehreren Typen aufrufen können, aber ich sehe bestimmte Anforderungen in der Beschreibung nicht. Erstens scheint es keinen gemeinsamen Basistyp zu erfordern (nicht dass ich mir vorstellen könnte, DAS ohne void * zu implementieren), und es können mehrere Objekte beteiligt sein.

Anstatt die Methode Start() für jedes Objekt in einer Liste aufzurufen (ein klassisches Beispiel für Polymorphie), können Sie eine an anderer Stelle definierte Methode StartObject (Object C) aufrufen, um den Argumenttyp zur Laufzeit zu überprüfen und handle es angemessen. Der Unterschied besteht darin, dass die Methode Start() in die Klasse integriert werden muss, während die Methode StartObject() außerhalb der Klasse definiert werden kann, damit die verschiedenen Objekte nicht mit einer Schnittstelle übereinstimmen müssen.

Was könnte schön sein, wenn die Methode Start() mit verschiedenen Argumenten aufgerufen werden musste. Vielleicht Car.Start (Key carkey) vs. Missile.Start (int launchCode)

Aber beide konnten als Startobject (thecar) oder Startobject (theMissile)

Interessantes Konzept ...

1

wenn aufgerufen werden Sie wollen, dass die konzeptionelle Äquivalent eines Methodenaufruf

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

auf jeden spezifischen Typ in dem Tupel abhängen, dann mehrere Dispatch wollen. Polymorphie entspricht dem Fall n = 1 und ist ein notwendiges Merkmal von OOP.

3

Bei der Mehrfachvermittlung kann eine Methode mehrere Argumente übergeben, und welche Implementierung verwendet wird, hängt vom jeweiligen Argumenttyp ab. Die Reihenfolge, in der die Typen ausgewertet werden, hängt von der Sprache ab. In LISP prüft es jeden Typ vom ersten bis zum letzten. Sprachen mit mehrfachem Versand verwenden generische Funktionen, die nur Funktionsdelkarationen sind und nicht wie generische Methoden, die Typparameter verwenden.

Mehrfache Versendung ermöglicht subtyping polymorphism von Argumenten für Methodenaufrufe.

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

Darüber hinaus, Generika bietet parametrischen Typen Polymorphismus (zB gleiche generische Schnittstelle mit verschiedenen Typen zu verwenden, auch wenn sie nicht, wie List < T> in Verbindung stehend - es kann eine Liste von jeder Art und wird auf die gleiche Weise verwendet).

Verwandte Themen