這兩者都有一點。爲了使用泛型類,必須在編譯時爲其指定類型參數,但類型參數可以是接口或基類,因此運行時使用的對象的實際類型可能會有所不同。
例如,在這裏我有一個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,其中利用在運行時的示例。
您可能想看看這篇文章:http://blogs.msdn.com/b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx – Guillaume
@Guillaume偉大的,短文。我正在尋找E.L的東西。作爲參考。 – FishBasketGordo