我正在查看抽象类中的一些代码:
public virtual void CountX(){}
public virtual void DoCalculation() { ...code}
如果在派生类型中不需要重写它,为什么我应该在抽象类中声明一个空虚方法?
最佳答案
因为如果默认行为是什么也不做,但是派生类可能想要做一些事情。这是一个完全有效的结构。
它允许您的基本代码调用它。当有“BeforeXXX”和“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)是抽象的,那么所有派生类都需要实现它们(很可能是空方法)——代码垃圾可以使用空虚方法在基础上移除.
关于c# - 没有主体的虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5536201/