代码之家  ›  专栏  ›  技术社区  ›  Sam Holder Brian Adams

fxcop规则ca1061“不隐藏基类方法”的背后是什么?

  •  0
  • Sam Holder Brian Adams  · 技术社区  · 15 年前

    为什么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 回复  |  直到 15 年前
        1
  •  4
  •   Justin Niessner    15 年前

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

    基类型中的方法被隐藏 在 当参数 派生方法的签名 只因类型不同而不同 弱派生于相应的 参数签名中的类型 基本方法。

    在子类中,contains方法 object 它的类型弱于 string 因此隐藏了父母。

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

    即使这是一个有意的设计选择,我也会认为这不一定是一个好的选择。如果您已经知道集合将包含字符串而不包含其他内容,那么为什么要提供 Contains 一串 ?似乎你在设计中增加了灵活性,但最终,你只会让其他开发人员感到困惑。

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

        2
  •  0
  •   Henrik    15 年前

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

        3
  •  0
  •   amelvin    15 年前

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

    基类型中的方法被隐藏 在 当参数 派生方法的签名 只因类型不同而不同 弱派生于相应的 参数签名中的类型 基本方法。

    编辑

    基本上,您隐藏的是基方法(public bool包含在set中),它现在永远不会优先于派生方法运行。但由于派生方法的定义比基方法弱,因此在某些情况下,基方法是首选方法。