Pergunta

... ou eles são a mesma coisa? Eu noto que cada um tem a sua própria entrada na Wikipedia: Polimorfismo , despacho múltiplo , mas eu estou tendo vendo problemas como os conceitos são diferentes.

Editar: E como Sobrecarga se encaixam em tudo isso ?

Foi útil?

Solução

O polimorfismo é a facilidade que permite uma linguagem / programa para decisões make durante a execução de qual método para invocar com base nos tipos dos parâmetros enviados para esse método.

O número de parâmetros utilizados pela linguagem / runtime determina o 'tipo' de polimorfismo suportado por uma linguagem.

Single expedição é um tipo de polimorfismo, onde apenas um parâmetro é usado (o receptor da mensagem - this, ou self). Para determinar a chamada

despacho múltiplo é um tipo de polimorfismo, onde em vários parâmetros são usados ??para determinar qual método para chamar. Neste caso, o receptor, bem como os tipos dos parâmetros do método são utilizados para dizer qual o método para invocar.

Então você pode dizer que o polimorfismo é o termo geral e despacho múltiplo e único são tipos específicos de polimorfismo.

Adenda: A sobrecarga acontece durante o tempo de compilação. Ele usa as informações tipo disponível durante a compilação para determinar qual tipo de método de chamada. Single / despacho múltiplo acontece durante a execução.

Exemplo de código:

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

Outras dicas

Com múltiplos expedição, um método pode ter vários argumentos passado para ele e cuja implementação é usado depende do tipo de cada argumento. A fim de que os tipos são avaliados depende do idioma. Em LISP, ele verifica cada tipo do primeiro ao último. Os idiomas com uso múltiplo expedição marca de funções genéricas, que são declarações apenas de função e não são como métodos genéricos, que parâmetros de tipo de uso.

expedição múltipla permite subtipos polimorfismo de argumentos para chamadas de método .

Individual expedição também permite uma mais limitado tipo de polimorfismo (usando o mesmo nome de método para objectos que implementam a mesma interface ou herdar a mesma classe de base). É o exemplo clássico de polimorfismo, onde você tem métodos que são substituídos em subclasses.

Além disso, genéricos fornecer polimorfismo tipo paramétrico (ou seja, a mesma interface genérica para usar com diferentes tipos, mesmo se eles não estão relacionados - como List<T>: pode ser uma lista de qualquer tipo e é usado da mesma forma independentemente).

Eu nunca ouvi falar de despacho múltiplo antes, mas depois de olhar para a página da Wikipedia que se parece muito com MD é um tipo de polimorfismo, quando usado com os argumentos para um método.

O polimorfismo é essencialmente o conceito de que um objeto pode ser visto como qualquer tipo que é de base. Então, se você tem um Car e uma Truck, ambos podem ser vistos como um Vehicle. Isto significa que você pode chamar qualquer método Vehicle para qualquer um.

expedição múltipla é semelhante, na medida em que permite que você chamar métodos com argumentos de vários tipos, porém não vejo certos requisitos na descrição. Primeiro, ele não parece exigir um tipo de base comum (não que eu poderia imaginar que transpõem esse sem void*) e você pode ter vários objetos envolvidos.

Assim, em vez de chamar o método Start() em cada objeto em uma lista (que é um exemplo clássico polimorfismo), você pode chamar um método StartObject(Object C) definido em outro lugar e código-lo para verificar o tipo de argumento em tempo de execução e manipulá-lo adequadamente. A diferença aqui é que o método Start() deve ser construído para a classe, enquanto o método StartObject() pode ser definida fora da classe para os vários objetos não precisa obedecer a uma interface.

Esta poderia ser bom se o método Start() precisava ser chamado com argumentos diferentes. Talvez Car.Start(Key carKey) vs. Missile.Start(int launchCode)

Mas ambos poderia ser chamado como StartObject(theCar) ou StartObject(theMissile)

conceito Interessante ...

Multiple expedição é mais semelhante a sobrecarga de funções (como visto em Java / C ++), exceto a função invocada depende do tipo de tempo de execução dos argumentos, e não seu tipo estático.

Se você quer o equivalente conceitual de uma invocação de método

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

depender de cada tipo específico na tupla, então você quer múltipla expedição. corresponde polimorfismo para o caso de n = 1 e é uma característica necessária do OOP.

Multiple Despacho é um tipo de polimorfismo. Em Java / C # / C ++, há polimorfismo através de herança e substituindo, mas isso não é despacho múltiplo, que é baseado em dois ou mais argumentos (e não apenas this, como em Java / C # / C ++)

Multiple Despacho depende de polimorfismo base. polimorfismo típico encontrado em C ++, C #, VB.NET, etc ... usa única expedição - ou seja, a função que é chamado depende apenas de uma instância de classe única. despacho múltiplo depende de várias instâncias de classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top