c# - 没有主体的虚拟方法

标签 c# inheritance virtual

我正在查看抽象类中的一些代码:

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/

相关文章:

c# - 如何在 "website"模式下使用 ResourceManager?

java - 静态变量是否继承

c# - 如何在选定的索引更改属性上找到 gridview 的数据键值?

c# - 如何正确验证适用于 YouTube v3 Google APIs for .NET 的 Google 帐户

java - 当子类Instance变成父类Instance时

java - 如何实现父类(super class)对象转换为子类对象的效果?

c++ - 如何使用 CPP/C# 从 VHDX 文件获取文件(或文件系统)

c++ - 为什么我必须重新声明继承类的虚函数?

c++ - 在 C++ 中,基类是否可以在所有派生类中调用虚拟方法?

c# - 设置默认值内联添加Jqgrid