c# - 泛型是运行时多态还是编译时多态?

标签 c# oop generics polymorphism

我读到以下格式属于参数多态性,但我们能否将其归为一类,即运行时多态性或编译时多态性?

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() 
   {...} 
 }  

最佳答案

两者兼而有之。为了使用泛型类,你必须在编译时给它一个类型参数,但类型参数可以是接口(interface)或基类,所以在运行时使用的对象的实际具体类型可能会有所不同。

例如,这里有一段代码带有 Stack<T> field 。我选择使用接口(interface)作为类型参数。这利用了 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 的示例,在运行时使用。

关于c# - 泛型是运行时多态还是编译时多态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12708090/

相关文章:

c# - 我可以说事件和委托(delegate)之间的关系采用复合模式吗?

ruby - 所有类方法都是用 "def self.foo"定义的吗?

java - 具有最不难看的泛型实现(或替代方案)的语言

c# - 如何使用 EF Core 在 ASP.NET Core 中取消应用迁移

c# - 如何在 Windows 8.1 中捕获高分辨率视频并从中捕获照片。我在尝试时有 UI 跳跃效果

c# - 预测两个 double 之和

ios - 初始化程序与默认属性值

java - 如何使用我创建的对象实例加载 ArrayList

c++ - C++通用类,为什么需要.cpp文件?

c# - 反射:调用具有泛型参数的方法