我读到以下格式属于参数多态,但是我们可以将它分为一个,运行时或编译时多态吗?
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()
{...}
}
答案 0 :(得分:11)
这两者都有点。为了使用泛型类,您必须在编译时为它提供一个类型参数,但type参数可以是接口或基类,因此在运行时使用的对象的实际具体类型可能会有所不同。
例如,我在这里有一段带有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的示例,在运行时使用。