Pregunta

...¿O son la misma cosa?Noto que cada uno tiene su propia entrada de Wikipedia: Polimorfismo, Despacho múltiple, pero tengo problemas para ver en qué se diferencian los conceptos.

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

¿Fue útil?

Solución

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 admitido por un lenguaje.

El envío único es un tipo de polimorfismo en el que 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 utilizan múltiples parámetros para determinar a 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 se puede decir que el polimorfismo es el término general y el envío múltiple y único son tipos específicos de polimorfismo.

Apéndice: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 envío único/múltiple ocurre durante el tiempo de ejecución.

Código de muestra:

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

Otros consejos

Con el envío múltiple, a un método se le pueden pasar múltiples argumentos y la implementación que se utiliza depende del tipo de cada argumento.El orden en que se evalúan los tipos depende del idioma.En LISP, verifica cada tipo desde el primero hasta el último.Los lenguajes con despacho múltiple utilizan funciones genéricas, que son solo declaraciones de funciones y no son como métodos genéricos, que usan parámetros de tipo.

El envío múltiple permite polimorfismo de subtipificación de argumentos para llamadas a métodos.

El envío único también permite un tipo de polimorfismo más limitado (usar 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, genéricos proporcionar polimorfismo de tipo paramétrico (es decir, 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).

Nunca antes había oído hablar del envío múltiple, pero después de echar un vistazo a la página de Wikipedia, parece 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 puede verse como cualquier tipo de base.Entonces si tienes un Car y un Truck, ambos pueden ser vistos como Vehicle.Esto significa que puedes llamar a cualquier Vehicle método para cualquiera de los dos.

El envío múltiple tiene un aspecto 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 pueda imaginar implementar ESO sin void*) y puede tener varios objetos involucrados.

Así que en lugar de llamar al Start() método en cada objeto en una lista (que es un ejemplo clásico de polimorfismo), puede llamar a un StartObject(Object C) método 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 Start() El método debe estar integrado en la clase, mientras que el StartObject() El método se puede definir fuera de la clase, por lo que los distintos objetos no necesitan ajustarse a una interfaz.

Esto podría ser bueno si el Start() El método necesitaba 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)

Interesante concepto...

El envío 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.

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

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

para depender de cada tipo específico en la tupla, entonces desea un envío múltiple.El polimorfismo corresponde al caso n=1 y es una característica necesaria de la programación orientada a objetos.

El envío múltiple es una especie de polimorfismo.En Java/C#/C++, existe polimorfismo a través de herencia y anulación, pero eso no es envío múltiple, que se basa en dos o más argumentos (no solo this, como en Java/C#/C++)

El envío múltiple se basa en polimorfismo.Polimorfismo típico encontrado en C++, C#, VB.NET, etc...utiliza envío único, es decirla función que se llama solo depende de una única instancia de clase.El envío múltiple se basa en múltiples instancias de clase.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top