这两者都有一点。为了使用泛型类,必须在编译时为其指定类型参数,但类型参数可以是接口或基类,因此运行时使用的对象的实际类型可能会有所不同。
例如,在这里我有一个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