reutilizacion polimórficas polimorfismo codigo c# c#-4.0 polymorphism

polimórficas - Los métodos polimórficos no funcionan en C#4



reutilizacion de codigo en java (3)

Acabo de tropezar con un problema muy interesante. Dando el siguiente código:

using System; class Program { class A { } class B : A { } private static void MyMethod(A a) /* first method */ { Console.WriteLine("A"); ; } private static void MyMethod(B b) /* second method */ { Console.WriteLine("B"); } static void Main(string[] args) { var a = new A(); // Call first method MyMethod(a); A b = new B(); // Should call the second method MyMethod(b); Console.ReadLine(); } }

Esperaría que se llame al segundo método porque el tipo de tiempo de ejecución de la variable es B. ¿Alguna idea de por qué el código llama al primer método?

Gracias, Tibi

Algunas aclaraciones: Polimorfismo significa varias formas que no tienen nada que ver en el lugar donde declaras el método.

La sobrecarga de métodos es una forma de polimorfismo, polimorfismo ad-hoc.

La forma en que el polimorfismo se implementa normalmente utilizando el enlace tardío.

dinámico es la solución para este problema.

El hecho es que esto no está funcionando en C # (o Java) es una decisión de diseño que me gustaría entender por qué se hizo, y ninguna de las respuestas está respondiendo a esta pregunta.

/ Tibi


Este no es un ejemplo de polimorfismo en absoluto. El polimorfismo entra en juego cuando llamas los métodos al objeto, no cuando el objeto se usa como parámetro. Este es solo un ejemplo simple de sobrecarga de métodos.

Usted declaró que b era de tipo A, por lo que el compilador vinculará la sobrecarga que utiliza el tipo A. Al enlazador no le importa que B sea una subclase de A, simplemente selecciona la sobrecarga con la firma más cercana a la declarada Tipos (no los tipos reales) de los parámetros pasados.

si desea obligarlo a usar el segundo método, envíe b in a escribir B en la llamada al método.

MyMethod((B)b);


La sobrecarga del método en C #, por defecto, se determina estáticamente en el momento de la compilación. Dado que está pasando una variable estáticamente estática de tipo A, vinculará estáticamente al método con la sobrecarga A. Use la palabra clave dinámica para obtener el comportamiento que desea.

static void Main(string[] args) { dynamic d = new A(); // Call first method MyMethod(d); d = new B(); // Call the second method MyMethod(d); Console.ReadLine(); }


No está llamando al segundo método porque la referencia a b sí es de tipo A Mientras que b contiene una referencia a una instancia de B , ese no es un tipo real de B , por lo que se elige la sobrecarga que utiliza una referencia A