繁体   English   中英

C#多态

[英]C# Polymorphism


运行时多态性和编译时多态性有什么区别? 另外,早期绑定和晚期绑定之间有什么区别? 实例将不胜感激。

编译时多态

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

运行时多态

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

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");

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

编译时多态 -方法重载(具有相同的方法名称,但具有不同的签名)。 请通过以下网址查看有关方法重载的视频:http://csharp-video-tutorials.blogspot.com/2012/06/part-25-c-tutorial-method-overloading.html

运行时多态 -方法覆盖(在运行时使用基类引用变量调用子类覆盖的方法称为运行时多态)。 请通过以下网址查看有关方法覆盖(多态)的视频:http://csharp-video-tutorials.blogspot.com/2012/06/part-23-c-tutorial-polymorphism.html

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

在C#2中,所有绑定都是早期的,因为C#2是一种静态类型的语言。 后期绑定语言是一种在运行时进行方法绑定的语言。 (C#4引入了dynamic提供了后期绑定功能。)

我不确定运行时与编译时多态的含义。

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

早期绑定和静态绑定是相同的。后期绑定和动态绑定是相同的。动态绑定表示编译器将选择在运行时调用哪个方法。静态绑定表示编译器将选择在编译时调用的方法。当我们使用is-a关系时继承并将派生类引用分配给基类引用。我们将仅允许调用或访问基类引用。roslyn服务将提供关键字virtual,abstract和override来按基类引用调用派生类成员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM