繁体   English   中英

C#继承最佳实践

[英]C# Inheritance best-practice

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

我的问题是,尽管这很有效,但在运行代码分析时,我警告不要直接调用虚函数。

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

直接使用虚方法有哪些缺点?

编辑:警告是:

CA2214:Microsoft.Usage:xxx包含一个调用链,该调用链导致调用该类定义的虚方法。 检查以下调用堆栈是否存在意外后果

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

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

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

我将专注于制作DisplayView ,或者从那个角度评估您的设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM