2010-10-01 22 views
7


¿Cuál es la diferencia entre el polimorfismo en tiempo de ejecución y el polimorfismo en tiempo de compilación? Además, ¿cuál es la diferencia entre el enlace anticipado y el enlace tardío? Los ejemplos serían muy apreciados.C# Polimorfismo

+7

Tiene que hacer una * pregunta *. Estos términos no tienen nada en común. –

+3

¿Quieres ejemplos para google mejor? –

+6

¿Debería etiquetarse como 'tarea'? – keyboardP

Respuesta

31

Tiempo de Compilación polimorfismo

sobrecarga de métodos es un gran ejemplo. Puede tener dos métodos con el mismo nombre pero con diferentes firmas. El compilador elegirá la versión correcta para usar en tiempo de compilación.

tiempo de ejecución de polimorfismo

Anulación de un método virtual de una clase padre en una clase de niño es un buen ejemplo. Otra es una clase que implementa métodos desde una interfaz. Esto le permite usar el tipo más genérico en el código mientras usa la implementación especificada por el niño. Dadas las siguientes definiciones de clases:

public class Parent 
{ 
    public virtual void SayHello() { Console.WriteLine("Hello World!"); } 
} 

public class Child : Parent 
{ 
    public override void SayHello() { Console.WriteLine("Goodbye World!"); } 
} 

El siguiente código de salida "Adiós mundo!":

Parent instance = new Child(); 
instance.SayHello(); 

pronto enlace

Especificación del tipo en tiempo de compilación:

SqlConnection conn = new SqlConnection(); 

Late Bind ing

El tipo se determina en tiempo de ejecución:

object conn = Activator.CreateInstance("System.Data.SqlClient.SqlConnection"); 
+1

¿Cómo encajan los genéricos .Net en la imagen aquí? En C++, las plantillas expresan polimorfismo en tiempo de compilación. thx –

3

ACTUALIZACIÓN: Por favor, vea los comentarios de Eric Lippert a esta respuesta.

En C# 2, todo el enlace es temprano, porque C# 2 es un lenguaje estático. Un lenguaje de enlace tardío sería aquel en el que el enlace del método se produce en tiempo de ejecución. (C# 4 incluye una función de vinculación tardía con la introducción de dynamic).

No estoy seguro de lo que quiere decir con tiempo de ejecución frente a polimorfismo de tiempo de compilación.

El compilador de C# determinará en el momento de la compilación a qué método se llamará la sobrecarga. El tipo de tiempo de ejecución de una instancia determinará qué implementación de una sobrecarga de método particular se ejecutará. Todavía se considera enlace anticipado aunque se produzca en tiempo de ejecución, porque el método seleccionado está restringido a ser una implementación de una sobrecarga de método virtual específica, y no es posible que dicha llamada genere una excepción relacionada con el tipo como puede ocurrir con un lenguaje dinámico y enlace tardío.

+0

C# 2 admite la vinculación tardía en el nivel de idioma en forma de * envío virtual *. En los lenguajes de despacho virtuales, la llamada al método está * enlazada con retraso * porque el * método * exacto llamado no se determina hasta * tiempo de ejecución *. La * firma * del método se determina en tiempo de compilación pero el * método realmente llamado * no lo es. C# 4 admite la vinculación dinámica tardía: puede determinar * todo * sobre el método (excepto su nombre) en tiempo de ejecución. –

+0

Re: su actualización: las opiniones varían. Algunas personas consideran que el envío virtual es vinculante tarde porque el método llamado se determina en tiempo de ejecución. (Estos tienden a ser personas con un fondo en C u otro lenguaje de enlace mayoritariamente estático.) Algunas personas lo consideran vinculante porque la * ranura * que contendrá el puntero del método se determina en tiempo de compilación. (Estos tienden a ser personas que están acostumbradas a la programación COM o C++, donde casi todas las llamadas son virtuales). Personalmente trato de usar solo "enlace tardío" para decir "dinámico". –

+0

@Eric Lippert - Bien, eso tiene sentido. Su uso de "enlace tardío" parece similar al mío entonces. Siempre he pensado en "temprano" y "tarde" para indicar, en efecto, el momento en que se detecta el error cuando algo sale mal. ¡Gracias por tus comentarios! –

3

Una respuesta muy simple y directa para la diferencia entre el tiempo de compilación y el polimorfismo de tiempo de ejecución.

Compile Time Polymorphism - Método de sobrecarga (que tiene el mismo nombre pero con una firma diferente).Por favor, compruebe el video en la sobrecarga de métodos en esta dirección URL http://csharp-video-tutorials.blogspot.com/2012/06/part-25-c-tutorial-method-overloading.html

tiempo de ejecución polimorfismo - el reemplazo de métodos (Invocar los métodos de clase hija anulados en tiempo de ejecución, utilizando una variable de referencia de la clase base se denomina como polimorfismo de tiempo de ejecución). Por favor, compruebe los videos sobre la anulación de método (polimorfismo) en esta URL http://csharp-video-tutorials.blogspot.com/2012/06/part-23-c-tutorial-polymorphism.html