FXCop 规则接口方法应该可以被子类型调用

Posted

技术标签:

【中文标题】FXCop 规则接口方法应该可以被子类型调用【英文标题】:FXCop rule Interface methods should be callable by child types 【发布时间】:2011-09-20 17:18:45 【问题描述】:

在运行 FxCop 时,我收到接口方法应该可由子类型调用的错误。

决议规定如下:

“使'MenuPreview'密封(如果这个类之前已经发布了一个重大更改), 非显式地实现该方法,或实现一个暴露的新方法 'IComponentConnector.Connect(int, object)' 的功能 并且对派生类可见。”

我为从 Window 或其他一些 UI 类派生的所有类得到这个。这是我可以忽略的红鲱鱼,还是我应该做些什么?

【问题讨论】:

【参考方案1】:

我认为问题在于,如果显式实现接口,派生类就不可能既改变接口行为又利用基类行为。在需要显式接口实现的情况下,解决此困难的一种常见模式是让接口只调用受保护的虚拟方法,并让任何希望覆盖接口行为的派生类通过以下方式这样做受保护的虚方法。

考虑 IDisposable.Dispose()。如果显式实现中的代码实际上负责执行处置,则派生类将无法添加自己的处置逻辑,除非重新实现 IDisposable,并且重新实现 IDisposable 的类将无法访问其父母的 Dispose 方法。尽管 Microsoft 可以让 IDisposable.Dispose 调用具有不同名称的受保护函数,但它选择使用相同的名称,但添加了一个布尔类型的虚拟参数。

【讨论】:

以上是关于FXCop 规则接口方法应该可以被子类型调用的主要内容,如果未能解决你的问题,请参考以下文章

如何编写代码分析 (FxCop) 规则以防止方法调用

FxCop 规则确保在测试中首先调用某个接受 lambda 的方法

需要验证参数的 FxCop 自定义规则

是否有自定义 FxCop 规则可以检测未使用的 PUBLIC 方法?

修复 FxCop 规则:枚举应该是强类型的

如何获取 FxCop 中 callvirt IL 指令实际调用的方法