c# programming-languages multiple-dispatch single-dispatch

¿Es C#un único despacho o un idioma de despacho múltiple?



programming-languages multiple-dispatch (8)

C # es un solo despacho, pero hay algunas publicaciones de blog que por su título parece que intentan emular multimétodos. Si puedo cargar uno de los artículos, actualizaré mi respuesta aquí.

Estoy tratando de entender qué es el envío único y múltiple, exactamente.

Acabo de leer esto:
http://en.wikipedia.org/wiki/Multiple_dispatch

Y a partir de esa definición me parece que C # y VB.Net son de despacho múltiple, aunque la elección de qué sobrecarga llamar se realiza en tiempo de compilación.

¿Estoy en lo correcto aquí, o me estoy perdiendo algo? ¡Gracias!


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.


De acuerdo con el artículo citado de Wikipedia , el despacho 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 usan, porque la decisión se toma, como usted dice, en tiempo de compilación. .


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


Bien, entendí la sutil diferencia en que 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 de el tipo más bajo ... (Si alguien puede pensar en una mejor manera de expresar esto, no dude en editar 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.

Perdón por la actualización del doc ... Esta me parece la forma más clara de explicar esta diferencia, en lugar de simplemente 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


Para aquellos que encuentran este artículo usando un motor de búsqueda, C # 4.0 introduce la palabra clave dinámica . 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); }


Tal vez alguien esté interesado en un buen ejemplo de C # para el despacho múltiple utilizando la palabra clave dinámica ( MSDN blog )

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