FXCop规则背后的内容CA1061“不要隐藏基类方法”?

时间:2010-07-06 12:12:53

标签: override fxcop

为什么FxCop规则CA1061是个坏主意?

文档声明不应该禁止此规则。如果我有这样的课程:

public class Set<T>
{    List<T> m_backingList;

     public bool Contains(T value)
     {
         return m_backingList.Contains(value);
     }
}  

然后我添加一个这样的具体实现:

public class CaseInsensitiveSet : Set<String>
{
    public bool Contains(object value)
    {
         string stringValue  = value as string;
         if (stringValue == null)
             return false;
         return base.Contains(stringValue);
    }
}
FxCop抱怨说,但我不确定为什么这是个坏主意。我没有看到这个实现的问题吗?

3 个答案:

答案 0 :(得分:4)

该规则说明了您收到消息的原因:

  

隐藏基类型中的方法   一个同名的方法   派生类型时的参数   派生方法的签名   不同之处仅在于更多类型   比相应的弱派生   参数签名中的类型   基本方法。

在您的子类中,Contains方法采用的object类型比string更弱,因此会隐藏父级。

您从FxCop收到警告的原因是,这可能不是故意的设计选择(因为您没有覆盖任何内容或使用new关键字)。

即使这是一个有意的设计选择,我也认为它不一定是好的选择。如果您已经知道该集合将包含字符串而没有其他内容,为什么您会提供Contains方法除string以外的其他方法?看起来您可能会在设计中增加灵活性,但最终,您真的只会混淆其他开发人员。

还有其他命名选项,而不是调用方法Contains,它不会隐藏(有意或无意)基础包含方法。

答案 1 :(得分:0)

http://msdn.microsoft.com/en-us/library/ms182143(VS.80).aspx

  

隐藏基类型中的方法   一个同名的方法   派生类型时的参数   派生方法的签名   不同之处仅在于更多类型   比相应的弱派生   参数签名中的类型   基本方法。

修改

基本上你是隐藏了基本方法(公共bool包含在Set中),它现在永远不会优先于派生方法运行。但派生方法比基本方法定义更弱,因此有些情况下基本方法是更好的方法。

答案 2 :(得分:0)

问问自己:我是否希望用户能够在派生类的实例上调用基类方法。 如果答案是肯定的:不要隐藏基本方法,因为这会使它使用起来更麻烦。 如果答案是否定的:不要派生自这个类,否则他们仍然可以通过将对象强制转换为基类来访问基本方法。