c#继承最佳实践
本文关键字:最佳 继承 | 更新日期: 2023-09-27 18:17:54
我有一个叫做BaseView
的普通类,它有一个虚拟方法DisplayView
。这个方法调用GetHeader
和GetBody
虚拟方法来获取页面的内容。然后,我将创建一个继承自BaseView
的类,并覆盖需要以不同于基类的方式显示内容的方法。
我的问题是,虽然这工作得很好,当运行代码分析时,我被警告不要直接调用虚函数。
我应该在覆盖虚函数的基类之上创建另一个类层,并且只继承它吗?
直接使用虚方法的缺点是什么?
编辑:警告是:
CA2214: Microsoft。用法:xxx包含一个调用链,导致a调用由类定义的虚方法。回顾以下内容非预期结果的调用堆栈
我认为问题是DisplayView
是虚拟的,它调用虚拟方法。在大多数情况下,虚拟方法由最终方法调用,作为改变行为的手段,例如在策略模式中。如果final方法调用虚方法,编译器知道在所有派生类中都会调用虚方法,因此虚方法存在是有效的。
你从virtual调用virtual的事实意味着你的设计可能会受到质疑:如果DisplayView
是虚拟的,另一个实现可能会覆盖它。当前实现调用虚拟GetHeader
,但派生类可能不会。因此,它不能保证GetHeader
不是死代码。
这可能是FxCop引起你注意的地方。它想知道,如果你在基类中定义了一个虚方法(在这个例子中是GetHeader
),那么所有的派生实现都会使用它。
我会专注于让DisplayView
最终完成,或者从这个角度评估你的设计。