C#多态性

运行时多态性和编译时多态性之间有什么区别? 另外,早期绑定和后期绑定有什么区别? 例子将受到高度赞赏。

编译时间多态性

方法重载就是一个很好的例子。 您可以使用两个名称相同但签名不同的方法。 编译器将选择在编译时使用的正确版本。

运行时多态性

从子类中的父类重写虚拟方法就是一个很好的例子。 另一个是从Interface实现方法的类。 这允许您在使用子指定的实现时在代码中使用更通用的类型。 给定以下类定义:

 public class Parent { public virtual void SayHello() { Console.WriteLine("Hello World!"); } } public class Child : Parent { public override void SayHello() { Console.WriteLine("Goodbye World!"); } } 

以下代码将输出“Goodbye World!”:

 Parent instance = new Child(); instance.SayHello(); 

早期绑定

在编译时指定类型:

 SqlConnection conn = new SqlConnection(); 

后期绑定

类型在运行时确定:

 object conn = Activator.CreateInstance("System.Data.SqlClient.SqlConnection"); 

更新:请参阅Eric Lippert对此答案的评论。

在C#2中,所有绑定都是早期的,因为C#2是一种静态类型的语言。 后期绑定语言是在运行时发生方法绑定的语言。 (C#4包含一个后期绑定function,引入了dynamic 。)

我不确定你的运行时间与编译时多态性是什么意思。

C#编译器将在编译时确定将调用哪个方法重载。 实例的运行时类型将确定将执行特定方法重载的哪个实现。 这仍然被认为是早期绑定,即使它发生在运行时,因为所选方法被约束为特定虚方法重载的实现,并且这样的调用不可能生成类型相关的exception,例如can以动态语言和后期绑定发生。

编译时和运行时多态之间差异的一个非常简单直接的答案。

编译时间多态 – 方法重载(具有相同的方法名称但具有不同的签名)。 请查看此URL上有关方法重载的videohttp://csharp-video-tutorials.blogspot.com/2012/06/part-25-c-tutorial-method-overloading.html

运行时多态性 – 方法重写(在运行时调用子类重写方法,使用基类引用变量称为运行时多态)。 请在此URL查看有关方法覆盖(多态性)的videohttp://csharp-video-tutorials.blogspot.com/2012/06/part-23-c-tutorial-polymorphism.html

早期绑定和静态绑定是相同的。绑定和动态绑定是相同的。动态绑定意味着编译器将选择在runtime.static绑定上调用哪个方法意味着编译器将选择在编译时调用的方法。当我们使用is-a关系时inheritance和赋值给类引用的类引用。我们将允许只调用或访问基类reference.roslyn服务将提供关键字virtual,abstract和override来通过基类引用调用派生类成员。