qué poo polimorfismo parametrico herencia encapsulamiento caracteristicas oop polymorphism multiple-dispatch double-dispatch

oop - parametrico - polimorfismo poo



¿Cuál es la diferencia entre Polimorfismo y Despacho múltiple? (7)

Con despacho múltiple, un método puede tener múltiples argumentos pasados ​​y la implementación que se usa depende del tipo de cada argumento. El orden en que se evalúan los tipos depende del idioma. En LISP, comprueba cada tipo de principio a fin. Los idiomas con despacho múltiple hacen uso de funciones genéricas, que son solo desviaciones de funciones y no son como métodos genéricos, que usan parámetros de tipo.

El envío múltiple permite subtipificar el polimorfismo de argumentos para llamadas a métodos.

Single-dispatch también permite un tipo más limitado de polimorfismo (el mismo nombre de método para objetos que implementan la misma interfaz o heredan la misma clase base). Es el ejemplo clásico de polimorfismo, donde tienes métodos que se anulan en subclases.

Más allá de eso, los genéricos proporcionan polimorfismo de tipo paramétrico (por ejemplo, la misma interfaz genérica para usar con diferentes tipos, incluso si no están relacionados, como List <T>; puede ser una lista de cualquier tipo y se usa de la misma manera independientemente )

...¿O son la misma cosa? Noté que cada uno tiene su propia entrada en Wikipedia: [[1]] ( http://en.wikipedia.org/wiki/Polymorphism_(computer_science)) [2] , pero me cuesta ver cómo difieren los conceptos.

Editar: ¿Y cómo encaja la Sobrecarga en todo esto?


Despacho múltiple es un tipo de polimorfismo. En Java / C # / C ++, hay polimorfismo a través de herencia y anulación, pero eso no es Despacho múltiple, que se basa en 2 o más argumentos (no solo esto , como en Java / C # / C ++)


El Despacho múltiple es más parecido a la sobrecarga de funciones (como se ve en Java / C ++), excepto que la función invocada depende del tipo de tiempo de ejecución de los argumentos, no de su tipo estático.


El polimorfismo es la función que permite que un lenguaje / programa tome decisiones durante el tiempo de ejecución sobre qué método invocar en función de los tipos de parámetros enviados a ese método.

La cantidad de parámetros utilizados por el lenguaje / tiempo de ejecución determina el "tipo" de polimorfismo soportado por un idioma.

El envío único es un tipo de polimorfismo donde solo se utiliza un parámetro (el receptor del mensaje, this o self ) para determinar la llamada.

El envío múltiple es un tipo de polimorfismo en el que se usan múltiples parámetros para determinar qué método llamar. En este caso, el receptor y los tipos de parámetros del método se utilizan para indicar qué método invocar.

Entonces, puede decir que el polimorfismo es el término general y que el despacho múltiple y único son tipos específicos de polimorfismo.

Adición: la sobrecarga ocurre durante el tiempo de compilación. Utiliza la información de tipo disponible durante la compilación para determinar qué tipo de método llamar. El despacho único / múltiple ocurre durante el tiempo de ejecución.

Código de muestra:

using NUnit.Framework; namespace SanityCheck.UnitTests. { [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 { } } }


Multiple Dispatch se basa en polimorfismo. El polimorfismo típico que se encuentra en C ++, C #, VB.NET, etc. usa un único envío, es decir, la función que se llama solo depende de una sola instancia de clase. El despacho múltiple depende de instancias de clases múltiples.


Nunca antes había oído hablar de Despacho múltiple, pero después de echar un vistazo a la página de Wikipedia parece mucho que MD es un tipo de polimorfismo, cuando se usa con los argumentos de un método.

El polimorfismo es esencialmente el concepto de que un objeto se puede ver como cualquier tipo que sea su base. Entonces, si tiene un automóvil y un camión, ambos pueden ser vistos como un vehículo. Esto significa que puede llamar a cualquier método de vehículo para cualquiera de los dos.

El envío múltiple es similar, ya que le permite llamar a métodos con argumentos de varios tipos, sin embargo, no veo ciertos requisitos en la descripción. Primero, no parece requerir un tipo base común (no es que yo pueda imaginar implementar eso sin vacío *) y puede tener múltiples objetos involucrados.

Entonces, en lugar de llamar al método Start () en cada objeto de una lista, que es un ejemplo de polimorfismo clásico, puede llamar a un método StartObject (Object C) definido en otro lugar y codificarlo para verificar el tipo de argumento en tiempo de ejecución y manejarlo adecuadamente . La diferencia aquí es que el método Start () debe integrarse en la clase, mientras que el método StartObject () se puede definir fuera de la clase, por lo que los diversos objetos no necesitan ajustarse a una interfaz.

Lo cual podría ser bueno si el método Start () necesita ser llamado con diferentes argumentos. Tal vez Car.Start (Key carKey) vs. Missile.Start (int launchCode)

Pero ambos podrían llamarse como StartObject (theCar) o StartObject (theMissile)

Concepto interesante ...


si quieres el equivalente conceptual de una invocación a un método

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

para depender de cada tipo específico en la tupla, entonces quieres despacho múltiple. El polimorfismo corresponde al caso n = 1 y es una característica necesaria de OOP.