我有一个名为BaseView
的普通类,它有一个虚拟方法DisplayView
。此方法调用GetHeader
和GetBody
虚拟方法来获取页面的内容。然后我将创建一个继承自BaseView
的类,并重写需要以不同于基类的方式显示内容的方法。
我的问题是,虽然这很有效,但在运行代码分析时,我被告知不要直接调用虚拟函数。
我应该在基类之上创建另一个类层来覆盖虚拟函数并且只从中继承吗?
直接使用虚拟方法有什么缺点?
编辑:警告是:
CA2214:Microsoft。用法:xxx包含导致
调用类定义的虚拟方法。回顾以下内容
意外后果的调用堆栈
最佳答案
我认为问题是DisplayView
是虚拟的,它在调用虚拟方法。在大多数情况下,最终方法调用虚拟方法作为改变行为的手段,例如在策略模式中。如果最终方法调用一个虚拟方法,编译器就知道在所有派生类中总是调用虚拟方法,因此它对于虚拟方法是有效的。
您从虚拟调用virtual的事实意味着您的设计可能会受到质疑:如果DisplayView
是虚拟的,则另一个实现可能会覆盖它。当前实现调用virtualGetHeader
,但派生类可能不调用。因此它不能保证GetHeader
不是死代码。
这可能就是fxcop吸引你注意的地方。它想知道,如果在基类中定义一个虚拟方法(在本例中是GetHeader
),则所有派生实现都将使用它。
我会把重点放在最终的设计上,或者从这个角度来评价你的设计。