2012-10-03 75 views
7

我讀到下面的格式屬於參數多態性,但是我們可以將它歸入一個運行時還是編譯時多態?是泛型運行時還是編譯時多態?

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

您可能想看看這篇文章:http://blogs.msdn.com/b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx – Guillaume

+0

@Guillaume偉大的,短文。我正在尋找E.L的東西。作爲參考。 – FishBasketGordo

回答

9

這兩者都有一點。爲了使用泛型類,必須在編譯時爲其指定類型參數,但類型參數可以是接口或基類,因此運行時使用的對象的實際類型可能會有所不同。

例如,在這裏我有一個Stack<T>字段代碼片段。我選擇使用一個接口作爲類型參數。這在編譯時使用parametric polymorphism。你必須選擇哪種類型的參數,你_stack場將使用在編譯時:

public interface IFoo { void Foo(); } 

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

現在,當這個代碼片段其實就是跑,我可以用它的類實現IFoo任何對象,並且該決定沒有進行,直至運行時間:

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

這是subtype polymorphism,其中利用在運行時的示例。

+1

你能提供任何參考嗎? –

相關問題