2012-10-03 2 views
7

Ich lese, dass das folgende Format unter parametrischen Polymorphismus kommt, aber können wir es in einem, entweder Laufzeit- oder Kompilierzeit-Polymorphismus, klassifizieren?Ist Generika Laufzeit oder Zeit Polymorphismus kompilieren?

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

Sie können einen Blick auf diesen Artikel in Anspruch nehmen wollen: http://blogs.msdn.com/b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx – Guillaume

+0

@Guillaume Große, kurzer Artikel. Ich war auf der Suche nach etwas von E.L. Als Referenz. – FishBasketGordo

Antwort

9

Es ist ein wenig von beidem. Um eine generische Klasse zu verwenden, müssen Sie ihr zum Zeitpunkt der Kompilierung einen Typparameter geben, aber der Typparameter kann von einer Schnittstelle oder Basisklasse sein, so dass der tatsächliche, konkrete Typ der zur Laufzeit verwendeten Objekte variieren kann.

Zum Beispiel, hier habe ich einen Code-Snippet mit einem Stack<T> Feld. Ich habe gewählt, um eine Schnittstelle als Typ-Parameter zu verwenden. Dies nutzt parametric polymorphism bei der Kompilierung. Sie müssen, welchen Typ Parameter Ihres _stack Feld bei der Kompilierung wählen verwenden:

public interface IFoo { void Foo(); } 

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

Nun, wenn diese Code-Snippet tatsächlich ausgeführt ist, dass ich jede Objektklasse, deren Verwendung kann implementiert IFoo, und diese Entscheidung nicht über hergestellt bis zur Laufzeit werden:

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()); 

dies ein Beispiel für subtype polymorphism ist, die zur Laufzeit verwendet wird.

+1

Können Sie eine Referenz angeben? –