我有一个名为BaseView
的普通类,其虚拟方法为DisplayView
。此方法调用GetHeader
和GetBody
虚拟方法来获取页面的内容。然后,我将创建一个继承自BaseView
的类,并覆盖需要以与基类的方式不同的方式显示内容的方法。
我的问题是,尽管这很有效,但在运行代码分析时,我警告不要直接调用虚函数。
我应该在基类之上创建另一个覆盖虚函数的类层,并且只继承它吗?
直接使用虚拟方法有哪些缺点?
编辑:警告是:
CA2214:Microsoft.Usage:xxx包含一个导致a的调用链 调用由类定义的虚方法。查看以下内容 调用堆栈意外后果
答案 0 :(得分:4)
我认为问题是DisplayView
是虚拟的,它正在调用虚方法。在大多数情况下,最终方法调用虚方法作为改变行为的手段,例如在策略模式中。如果final方法调用虚方法,则编译器知道将始终在所有派生类中调用虚方法,因此它对于存在的虚方法是有效的。
您从虚拟调用虚拟的事实意味着您的设计可能会受到质疑:如果DisplayView
是虚拟的,则另一个实现可能会覆盖它。当前实现调用虚拟GetHeader
,但派生类可能不会。因此,它无法保证GetHeader
不是死代码。
这可能是FxCop引起你注意的。它想知道如果在基类中定义一个虚方法(在这种情况下为GetHeader
),所有派生实现都将使用它。
我会专注于制作DisplayView
最终版,或者从那个角度评估你的设计。