两者都有一点。为了使用泛型类,您必须在编译时给它一个类型参数,但类型参数可以是接口或基类,因此在运行时使用的对象的实际具体类型可能会有所不同。
例如,这里我有一个带有Stack<T>
字段的代码片段。我选择使用接口作为类型参数。这在编译时利用了参数多态性。您必须选择您的_stack
字段将在编译时使用的类型参数:
public interface IFoo { void Foo(); }
public Stack<IFoo> _stack = new Stack<IFoo>();
现在,当这段代码实际运行时,我可以使用其类 implements 的任何对象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());
这是在运行时使用的子类型多态性的一个示例。