public virtual void CountX(){}
public virtual void DoCalculation() { ...code}
为什么我应该在抽象类中声明一个空的虚拟方法,如果不强制以衍生类型覆盖它?
想做某事。 这是一个完美的有效结构。 IT允许您的基本代码调用它。 当有“ treftrefxxx”和“ afterxxx”代码时,您往往会看到类似的设计,在基类中,此代码为空,但是该方法需要在那里进行编译。 在派生的类中,此代码是可选的,但必须虚拟地覆盖。 在抽象类中它不应该混淆其行为的事实。
一个例子:
abstract class Base
{
public void ProcessMessages(IMessage[] messages)
{
PreProcess(messages);
// Process.
PostProcess(messages);
}
public virtual void PreProcess(IMessage[] messages)
{
// Base class does nothing.
}
public virtual void PostProcess(IMessage[] messages)
{
// Base class does nothing.
}
}
class Derived : Base
{
public override void PostProcess(IMessage[] messages)
{
// Do something, log or whatever.
}
// Don't want to bother with pre-process.
}
如果这些方法(pre,post)是抽象的,那么所有派生的类都将
need
以实现它们(可能是空方法) - 代码垃圾,可以使用基础上的空虚拟方法删除。当@adam告诉您,有很多情况是有道理的。当您创建一个抽象类时,这是因为您想为从该类派生的所有类创建一个通用界面。但是,在这种继承级别上,您将没有足够的信息来为该方法创建工作代码。 ,例如,如果创建类图,则使用
GetArea()或
circle(均源自figure)编写代码,以便能够为它们编写工作代码。 如果必须覆盖,并且没有默认逻辑可以在基类中写下,那么虚拟性是错误的,方法应该是抽象的。如果默认操作不做任何事情,而不是正如亚当提到的,在基类中制作空的虚拟方法是完美有效的结构 当您将该方法声明为抽象时,将继承的类has
覆盖该方法(提供实现)。 这是强制性的替代了该方法并提供了默认值以外的实现。