C# 虚方法virtual详解
内容提要
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#还允许属性和索引器是虚的。