2011-12-14 149 views
4

我有一个正常的类叫做BaseView虚拟方法DisplayView。该方法调用GetHeaderGetBody虚拟方法来获取页面的内容。然后我会创建一个继承自BaseView的类,并重写需要显示内容的方法,而不是基类的方式。C#继承最佳做法

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

我应该在覆盖虚函数的基类上创建另一个类图层,并且只能从那里继承吗?

直接使用虚拟方法有什么缺点?

编辑:警告是:

CA2214:Microsoft.Usage:XXX包含导致 呼叫到由类定义的虚拟方法的调用链。审查意想不到的后果

+7

请显示确切的警告消息 – 2011-12-14 11:07:19

+1

在派生类方法实现中添加新的/覆盖关键字,可能会发出此警告。 – Maheep 2011-12-14 11:08:16

回答

4

以下 调用堆栈我认为这个问题是DisplayView是虚拟的,它的调用虚拟方法。在大多数情况下,虚拟方法被最终方法调用,作为改变行为的手段,例如在战略模式中。如果最后一个方法调用一个虚拟方法,那么编译器知道在所有派生类中将始终调用该虚拟方法,因此它对于虚拟方法的存在是有效的。如果是虚拟的,则另一个实现可能会覆盖它。当前实现调用虚拟GetHeader,但派生类可能不会。因此它不能保证GetHeader不是死码。

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

我会专注于做最后的决定DisplayView,或者从这个角度评估你的设计。