抽象方法是虚拟的

本文关键字:虚拟 抽象方法 | 更新日期: 2023-09-27 18:36:47

声明方法abstract自动使其成为虚拟方法是否正确?

也就是说,在子类中我可以多次覆盖它,并且在运行时,将调用与对象的运行时类型相对应的方法?

是否可以声明一个抽象的非虚拟方法?也就是说,必须在非抽象子类中实现并且不能被覆盖的方法?

抽象方法是虚拟的

是的,根据定义,抽象方法是虚拟的;它们必须是可重写的,才能真正被子类覆盖:

当实例方法声明包含abstract修饰符时,该方法称为抽象方法。尽管抽象方法隐式也是虚方法,但它不能具有修饰符virtual

相反,你不能声明一个抽象的非虚拟方法,因为如果可以的话,你会有一个无法实现的方法,因此永远不能被调用,这使得它相当无用。

但是,如果你想让一个类实现

一个抽象方法,但不允许它的任何子类修改它的实现,这就是sealed的用武之地。举个例子:

abstract public class AbstractClass
{
    abstract public void DoSomething();
}
public class BaseClass : AbstractClass
{
    public sealed override void DoSomething()
    {
        Console.WriteLine("Did something");
    }
}

请注意,虽然抽象方法是(隐式)虚拟的,但具体基类中的实现是非虚拟的(因为 sealed 关键字)。

是的,它们是虚拟的。否则,您将无法为它们编写实现。