gpt4 book ai didi

C# 继承最佳实践

转载 作者:太空狗 更新时间:2023-10-30 01:24:46 29 4
gpt4 key购买 nike

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

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

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

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

编辑:警告是:

CA2214 : Microsoft.Usage : xxx contains a call chain that results in a call to a virtual method defined by the class. Review the following call stack for unintended consequences

最佳答案

我认为问题在于 DisplayView 是虚拟的,它正在调用虚拟方法。在大多数情况下, final方法调用虚拟方法作为改变行为的手段,例如在策略模式中。如果一个final方法调用了一个虚方法,编译器就知道这个虚方法总是会在所有的派生类中被调用,因此这个虚方法的存在是合法的。

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

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

我会专注于使 DisplayView 最终化,或者从那个角度评估您的设计。

关于C# 继承最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8503448/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com