没有身体的虚拟方法

问题描述 投票:0回答:4
我在抽象类中查看某些代码:

public virtual void CountX(){} public virtual void DoCalculation() { ...code}
为什么我应该在抽象类中声明一个空的虚拟方法,如果不强制以衍生类型覆盖它?
    

c# inheritance virtual
4个回答
52
投票
-Might

想做某事。 这是一个完美的有效结构。 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()

9
投票
rectangle

circle

(均源自figure)编写代码,以便能够为它们编写工作代码。 如果必须覆盖,并且没有默认逻辑可以在基类中写下,那么虚拟性是错误的,方法应该是抽象的。如果默认操作不做任何事情,而不是正如亚当提到的,在基类中制作空的虚拟方法是完美有效的结构 当您将该方法声明为抽象时,将继承的类has

覆盖该方法(提供实现)。 这是强制性的

7
投票
can

替代了该方法并提供了默认值以外的实现。


3
投票
从设计角度来看,这闻起来很闻名,并表明该设计的实现状态不成熟。如果每个派生特定基类的类都不需要方法,则根据定义,它不属于基类。通常,您会发现该方法由基类的特定派生使用,并指示继承层次结构中的新接口或抽象层。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.