【问题标题】:Adding a body to a virtual method that's supposed to be overridden将主体添加到应该被覆盖的虚拟方法
【发布时间】:2013-03-28 11:44:20
【问题描述】:

我有一个类是其他一些类的基础。该类有一个虚方法,它应该在派生类中被覆盖。它是这样定义的:

protected virtual TableFormat GetFormat()
{
    throw new NotImplementedException("Implement the format generator in derived class.");
}

这是好的做法吗?我的老板告诉我 NotImplementedException 应该只用于自动生成的代码,但我拒绝遵守,除非他给出理由。

此外,这似乎是在非抽象类中拥有抽象方法的好地方。为什么不允许这样做?

【问题讨论】:

    标签: c# coding-style notimplementedexception


    【解决方案1】:

    这是一个好习惯吗?:

    IMO,最好抛出NotImplementedException,因为你还会返回什么,如果你返回null,你的类的用户永远不会知道这个方法必须被覆盖。所以我不同意你老板的观点。

    这似乎是一个在 非抽象类。为什么不允许这样做?

    您可能会看到讨论:Abstract Method in Non Abstract Class

    我有一个类是其他一些类的基础。该班有一个 虚方法,它应该在派生中被覆盖 类。

    为什么不将方法定义为abstract 而不是虚拟的。

    在方法或属性声明中使用 abstract 修饰符 表示方法或属性不包含实现。

    但是

    • 抽象方法是隐含的虚拟方法。
    • 抽象方法声明只允许在抽象类中
    • 因为抽象方法声明没有提供实际实现,所以没有方法体;方法声明
      仅以分号结尾,并且没有大括号 ({ })
      在签名之后。

    【讨论】:

      【解决方案2】:

      如果您将该方法标记为abstract,则此类的任何实现都必须定义主体。您还需要将课程标记为abstract

      public abstract class MyClass 
      {
          protected abstract TableFormat GetFormat();
      }
      

      【讨论】:

        【解决方案3】:

        此类方法是强制覆盖该方法的有效方法。我认为这应该被允许,但你的老板可能不同意我的观点。

        其实如果这个你的类会被实例化,但是方法不会被调用,这种做法比做抽象类要好。你也可以尝试在这样的方法中进行严格的类型检查,这样如果当前实例正好属于这个类而不是子类(当然,如果可能的话),那么就不会抛出异常。

        【讨论】:

        • 恕我直言,这是一个糟糕的设计。如果打算重写该类,则不应实例化它。
        • 也许吧。我预计可能会有基类被实例化的用例,但开发人员想要强制行为覆盖。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 2014-01-05
        • 2012-10-26
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        相关资源
        最近更新 更多