关于C#:抽象方法是虚拟的吗?


Are abstract methods virtual?

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

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

是否可以声明抽象的非虚拟方法?也就是说,必须在非抽象子类中实现的方法不能被重写?


是的,抽象方法根据定义是虚拟的;为了实际被子类重写,它们必须是可重写的:

When an instance method declaration includes an abstract modifier, that method is said to be an abstract method. Although an abstract method is implicitly also a virtual method, it cannot have the modifier virtual.

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

但是,如果您希望让一个类实现一个抽象方法,但不允许它的任何子类修改它的实现,那么sealed就是在这里出现的。一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
abstract public class AbstractClass
{
    abstract public void DoSomething();
}

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

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


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