我有一个类是其他类的基础。该类有一个虚方法,应该在派生类中重写。这是它的定义:
protected virtual TableFormat GetFormat()
{
throw new NotImplementedException("Implement the format generator in derived class.");
}
这是好习惯吗?我的老板告诉我,NotImplementedException
应仅用于自动生成的代码,但我拒绝遵守,直到他给出了理由。
此外,这似乎是在非抽象类中使用抽象方法的好地方。为什么不允许这样做?
答案 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)
此类方法是强制覆盖该方法的有效方法。我认为这应该被允许,但你的老板可能不同意我的看法。
实际上,如果你的类将被实例化,但是不会调用该方法,这种做法比制作抽象类更好。您也可以在这样的方法中尝试严格类型检查,这样如果当前实例恰好是这个类而不是子类(当然,如果可能的话),那么就不会抛出异常。