我是否正确声明方法abstract
会自动将其设为虚拟?
也就是说,在子类中我可以多次覆盖它,并且在运行时,将调用与该对象的运行时类型相对应的方法?
是否可以声明一个抽象的非虚方法?也就是说,必须在非抽象子类中实现并且不能被覆盖的方法?
答案 0 :(得分:8)
是的,abstract methods are virtual的定义;它们必须是可覆盖的才能实际被子类覆盖:
当实例方法声明包含
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
关键字)。
答案 1 :(得分:1)
是的,它们是虚拟的。否则你将无法为它们编写实现。