【发布时间】:2012-06-10 14:45:54
【问题描述】:
声明一个方法 abstract 自动使其成为虚拟方法,我是否正确?
也就是说,在子类中我可以多次覆盖它,在运行时会调用对象的运行时类型对应的方法?
是否可以声明一个抽象的非虚方法?即必须在非抽象子类中实现且不能被覆盖的方法?
【问题讨论】:
标签: c#
声明一个方法 abstract 自动使其成为虚拟方法,我是否正确?
也就是说,在子类中我可以多次覆盖它,在运行时会调用对象的运行时类型对应的方法?
是否可以声明一个抽象的非虚方法?即必须在非抽象子类中实现且不能被覆盖的方法?
【问题讨论】:
标签: c#
是的,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 关键字)。
【讨论】:
是的,它们是虚拟的。否则你将无法为它们编写实现。
【讨论】: