2012-10-03 88 views
7

He leído que el siguiente formato viene en polimorfismo paramétrico, pero ¿podemos clasificarlo en uno, ya sea en tiempo de ejecución o en polimorfismo de tiempo de compilación?¿El genérico es el tiempo de ejecución o el tiempo de compilación del polimorfismo?

public class Stack<T> 
{ // items are of type T, which is known when we create the object 
    T[] items; 
    int count; 
    public void Push(T item) {...} 
    //type of method pop will be decided when we create the object 
    public T Pop() 
    {...} 
} 
+3

Es posible que desee echar un vistazo a este artículo: http://blogs.msdn.com/b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx – Guillaume

+0

@Guillaume Great, artículo corto. Estaba buscando algo por E.L. como una referencia. – FishBasketGordo

Respuesta

9

Es un poco de ambos. Para utilizar una clase genérica, debe darle un parámetro de tipo en tiempo de compilación, pero el parámetro de tipo podría ser de una interfaz o clase base, por lo que el tipo real concreto de los objetos utilizados en el tiempo de ejecución puede variar.

Por ejemplo, aquí tengo un fragmento de código con un campo Stack<T>. Elegí usar una interfaz como parámetro de tipo. Esto utiliza parametric polymorphism en tiempo de compilación. Debe elegir el parámetro de tipo de su campo _stack utilizará en tiempo de compilación:

public interface IFoo { void Foo(); } 

public Stack<IFoo> _stack = new Stack<IFoo>(); 

Ahora, cuando este fragmento de código es en realidad funcionan, puedo usar cualquier objeto cuya clase implementa IFoo, y que la decisión no tiene por para ser hecho hasta tiempo de ejecución:

public class Foo1 : IFoo { public void Foo() { Console.WriteLine("Foo1"); } } 

public class Foo2 : IFoo { public void Foo() { Console.WriteLine("Foo2"); } } 

public class Foo3 : IFoo { public void Foo() { Console.WriteLine("Foo2"); } } 

_stack.Push(new Foo1()); 
_stack.Push(new Foo2()); 
_stack.Push(new Foo3()); 

Este es un ejemplo de subtype polymorphism, que se utiliza en tiempo de ejecución.

+1

¿Puede proporcionarnos alguna referencia? –

Cuestiones relacionadas