为什么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抱怨说,但我不确定为什么这是个坏主意。我没有看到这个实现的问题吗?
答案 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)
问问自己:我是否希望用户能够在派生类的实例上调用基类方法。 如果答案是肯定的:不要隐藏基本方法,因为这会使它使用起来更麻烦。 如果答案是否定的:不要派生自这个类,否则他们仍然可以通过将对象强制转换为基类来访问基本方法。