C#继承最佳实践

时间:2011-12-14 11:05:18

标签: c# inheritance

我有一个名为BaseView的普通类,其虚拟方法为DisplayView。此方法调用GetHeaderGetBody虚拟方法来获取页面的内容。然后,我将创建一个继承自BaseView的类,并覆盖需要以与基类的方式不同的方式显示内容的方法。

我的问题是,尽管这很有效,但在运行代码分析时,我警告不要直接调用虚函数。

我应该在基类之上创建另一个覆盖虚函数的类层,并且只继承它吗?

直接使用虚拟方法有哪些缺点?

编辑:警告是:

  

CA2214:Microsoft.Usage:xxx包含一个导致a的调用链   调用由类定义的虚方法。查看以下内容   调用堆栈意外后果

1 个答案:

答案 0 :(得分:4)

我认为问题是DisplayView是虚拟的,它正在调用虚方法。在大多数情况下,最终方法调用虚方法作为改变行为的手段,例如在策略模式中。如果final方法调用虚方法,则编译器知道将始终在所有派生类中调用虚方法,因此它对于存在的虚方法是有效的。

您从虚拟调用虚拟的事实意味着您的设计可能会受到质疑:如果DisplayView是虚拟的,则另一个实现可能会覆盖它。当前实现调用虚拟GetHeader,但派生类可能不会。因此,它无法保证GetHeader不是死代码。

这可能是FxCop引起你注意的。它想知道如果在基类中定义一个虚方法(在这种情况下为GetHeader),所有派生实现都将使用它。

我会专注于制作DisplayView最终版,或者从那个角度评估你的设计。