2012-10-03 48 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

你能提供任何参考吗? –

相关问题