C# 虚方法virtual详解

💡 原文中文,约3400字,阅读约需8分钟。
📝

内容提要

C#的虚方法(virtual)允许基类定义一个方法的默认实现,但允许派生类提供自己的实现。使用virtual关键字声明一个方法为虚方法,在派生类中使用override关键字重写基类中的虚方法。调用虚方法时,实际调用的方法取决于对象的运行时类型。可以使用base关键字调用基类的实现。如果不想允许进一步的派生类重写某个方法,可以使用sealed关键字。抽象类可以包含虚方法,但抽象类本身不能被实例化。除了方法,C#还允许属性和索引器是虚的。虚方法是实现多态性的一种方式。

🔎

延伸解读

虚方法调用:运行时类型决定行为

调用虚方法时,实际执行哪个版本取决于对象的运行时类型,而非引用变量的声明类型。例如,将派生类实例赋值给基类变量后调用虚方法,会执行派生类的重写版本。这体现了多态的核心机制,也是编写通用代码的基础。

override与new:重写与隐藏的关键区别

在派生类中,override用于重写虚方法,而new用于隐藏基类同名方法。示例中,D类使用new隐藏了A类的Func,当通过A类型引用调用时,仍执行A的方法;而B类使用override,则执行B的方法。理解这一区别有助于避免多态行为不符合预期。

控制重写:sealed与抽象类的角色

如果不想让派生类继续重写某个虚方法,可以在重写时使用sealed关键字。抽象类可以包含虚方法,但不能被实例化,通常用于定义部分实现的基类。这些机制帮助开发者在继承层次中精确控制方法的可扩展性。

❓

Q&A

C#中的虚方法是什么?

虚方法是基类定义的可以被派生类重写的方法,使用virtual关键字声明。

如何在派生类中重写基类的虚方法?

在派生类中使用override关键字重写基类的虚方法。

调用虚方法时,实际调用哪个方法?

调用虚方法时,实际调用的方法取决于对象的运行时类型。

如何防止派生类重写某个虚方法?

可以使用sealed关键字来防止进一步的派生类重写某个虚方法。

抽象类可以包含虚方法吗?

是的,抽象类可以包含虚方法,但抽象类本身不能被实例化。

C#中除了方法,哪些元素可以是虚的?

C#还允许属性和索引器是虚的。

🏷️

标签

➡️

继续阅读