将主体添加到应该被覆盖的虚拟方法

时间:2013-03-28 11:44:20

标签: c# coding-style notimplementedexception

我有一个类是其他类的基础。该类有一个虚方法,应该在派生类中重写。这是它的定义:

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

这是好习惯吗?我的老板告诉我,NotImplementedException应仅用于自动生成的代码,但我拒绝遵守,直到他给出了理由。

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

3 个答案:

答案 0 :(得分:3)

  

这是一个好习惯吗?:

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

  

这似乎是一个抽象方法的好地方   非抽象类。为什么不允许这样做?

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

  

我有一个类是其他类的基础。班上有一个   虚方法,应该在派生中重写   类。

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

  

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

BUT

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

答案 1 :(得分:1)

如果您将方法标记为abstract,则此类的任何实现都必须定义正文。您还需要将班级标记为abstract

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

答案 2 :(得分:0)

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

实际上,如果你的类将被实例化,但是不会调用该方法,这种做法比制作抽象类更好。您也可以在这样的方法中尝试严格类型检查,这样如果当前实例恰好是这个类而不是子类(当然,如果可能的话),那么就不会抛出异常。