1

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

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

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

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

4

3 回答 3

3

这是一个好习惯吗?:

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

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

您可能会看到讨论:非抽象类中的抽象方法

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

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

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

  • 抽象方法隐含地是虚拟方法。
  • 抽象方法声明只允许在抽象类中。
  • 因为抽象方法声明没有提供实际的实现,所以没有方法体;方法声明仅以分号结尾,并且 签名后
    没有大括号 ({ }) 。
于 2013-03-28T11:45:58.697 回答
1

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

public abstract class MyClass 
{
    protected abstract TableFormat GetFormat();
}
于 2013-03-28T11:46:43.143 回答
0

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

事实上,如果这个你的类将被实例化,但方法不会被调用,这种做法比制作抽象类要好。您也可以尝试在这种方法中进行严格的类型检查,以便如果当前实例恰好属于此类但不是子类(当然,如果可能的话),则不会引发异常。

于 2013-03-28T11:49:01.167 回答