c#继承最佳实践

本文关键字:最佳 继承 | 更新日期: 2023-09-27 18:17:54

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

我的问题是,虽然这工作得很好,当运行代码分析时,我被警告不要直接调用虚函数。

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

直接使用虚方法的缺点是什么?

编辑:警告是:

CA2214: Microsoft。用法:xxx包含一个调用链,导致a调用由类定义的虚方法。回顾以下内容非预期结果的调用堆栈

c#继承最佳实践

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

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

这可能是FxCop引起你注意的地方。它想知道,如果你在基类中定义了一个虚方法(在这个例子中是GetHeader),那么所有的派生实现都会使用它。

我会专注于让DisplayView最终完成,或者从这个角度评估你的设计。