![](/img/trans.png)
[英]What is the best-practice way to use LINQ to SQL in a C# application? [Design-pattern]
[英]C# Inheritance best-practice
我有一个名为BaseView
的普通类,它带有一个虚方法DisplayView
。 此方法调用GetHeader
和GetBody
虚拟方法来获取页面的内容。 然后,我将创建一个继承自BaseView
的类,并覆盖需要以与基类的方式不同的方式显示内容的方法。
我的问题是,尽管这很有效,但在运行代码分析时,我警告不要直接调用虚函数。
我应该在基类之上创建另一个类层来覆盖虚函数并且只继承它吗?
直接使用虚方法有哪些缺点?
编辑:警告是:
CA2214:Microsoft.Usage:xxx包含一个调用链,该调用链导致调用该类定义的虚方法。 检查以下调用堆栈是否存在意外后果
我认为问题是DisplayView
是虚拟的,它正在调用虚拟方法。 在大多数情况下,最终方法调用虚方法作为改变行为的手段,例如在策略模式中。 如果final方法调用虚方法,则编译器知道将始终在所有派生类中调用虚方法,因此它对于存在的虚方法是有效的。
您从虚拟调用虚拟的事实意味着您的设计可能会受到质疑:如果DisplayView
是虚拟的,则另一个实现可能会覆盖它。 当前实现调用虚拟GetHeader
但派生类可能不调用。 因此,它不能保证GetHeader
不是死代码。
这可能是FxCop引起你注意的。 它想知道如果在基类中定义一个虚方法(在本例中为GetHeader
),所有派生实现都将使用它。
我将专注于制作DisplayView
,或者从那个角度评估您的设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.