Respuesta

34

Bien, entendí la sutil diferencia donde la sobrecarga de funciones es diferente de la distribución múltiple.

Básicamente, la diferencia es si el método para llamar se elige en tiempo de ejecución o en tiempo de compilación. Ahora, sé que todo el mundo dijo esto, pero sin un ejemplo claro, esto suena MUY obvio, dado que C# está tipado estáticamente y los lenguajes de despacho múltiple (al parecer para mí, al menos) parecen estar escritos dinámicamente. Hasta ahora, con solo esa definición, el despacho múltiple y la sobrecarga de funciones me parecían exactamente iguales.

El caso donde esto hace una diferencia real es cuando tienes 2 sobrecargas de un método que difieren en el tipo de un parámetro, pero los 2 tipos son polimórficos, y llamas con una referencia declarada como el tipo más alto, que tiene un objeto del tipo menor ... (Si alguien puede pensar en una mejor manera de expresar esto, no dude en para modificar esta respuesta)

Ejemplo:

int CaptureSpaceShip(IRebelAllianceShip ship) {} 
int CaptureSpaceShip(XWing ship) {} 

void Main() { 
    IRebelAllianceShip theShip = new XWing(); 
    CaptureSpaceShip(theShip); 
} 

XWING obviamente implementa IRebelAllianceShip. En este caso, se llamará al primer método, mientras que si C# implementó el despacho múltiple, se invocará el segundo método.

Disculpa por el doc rehash ... Esta me parece la manera más clara de explicar esta diferencia, en lugar de solo leer las definiciones para cada método de despacho.

Para una explicación más formal: http://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading

+0

Este es un buen ejemplo de la gran diferencia. –

+0

Gracias! Necesitaba un ejemplo como este. – John

+1

@Daniel Magliola, tenga en cuenta que el envío dinámico ahora es posible en C# 4.0 mediante la utilización de – RichardOD

5

C# es un solo envío, pero hay algunas publicaciones en el blog que por su título parece que están tratando de emular multimétodos. Si puedo cargar uno de los artículos, actualizaré mi respuesta aquí.

0

El patrón de visitante de GoF es un ejemplo de cómo hacer el doble despacho. Scott Meyers "C++ más efectivo" le muestra cómo hacerlo en C++. Aquí hay un link del Dr. Dobbs que habla sobre cómo hacer un despacho doble tanto en Java como en C++.

2

C# no admite envíos múltiples. El patrón de Diseño de visitante emula algo que podría describirse como despacho múltiple, aunque el patrón de Visitantes se centre principalmente en separar el algoritmo de una jerarquía.

1

De acuerdo con la cited Wikipedia article, envío múltiple, por definición, se basa en los tipos de tiempo de ejecución de los objetos involucrados, por lo que C# y VB.net no lo utilizan, porque se toma la decisión, como usted afirma, en tiempo de compilación.

17

Para aquellos que encontrar este artículo usando un motor de búsqueda, C# 4.0 introduce la palabra clave dynamic. El código se vería como el siguiente.

int CaptureSpaceShip(IRebelAllianceShip ship) {} 
int CaptureSpaceShip(XWing ship) {} 

void Main() { 
    IRebelAllianceShip theShip = new XWing(); 
    CaptureSpaceShip((dynamic)theShip); 
} 
+5

+1 . C# 4.0 es compatible con envíos múltiples. Versiones a continuación que no – RichardOD

0

Tal vez alguien esté interesado en el buen ejemplo C# para el envío múltiple usando la palabra clave dinámica (MSDN blog)

Wikipedia dice que C# 4.0 (dinámico) es el lenguaje de "despacho múltiple". También creo que los lenguajes como Java, C# (antes de 4.0), C++ son envío único.

Cuestiones relacionadas