我有以下代码片段在VS2008中生成"如果隐藏意图使用新关键字"警告:
public double Foo(double param) { return base.Foo(param); }
Foo()
基类中的函数受到保护,我想将它暴露给单元测试,方法是将它放在包装类中,仅用于单元测试.即包装类不会用于其他任何东西.所以我有一个问题是:这是一种公认的做法吗?
回到new
警告.为什么我必须在这种情况下更新覆盖功能?
该new
只是让绝对清楚地表明你知道你踩在现有的方法.由于现有的代码是protected
,它没有那么大 - 你可以安全地添加它new
来阻止它呻吟.
当你的方法做出不同的事情时,差异就来了; 任何引用派生类和调用的变量Foo()
都会做一些与引用基类和调用不同的东西(甚至使用相同的对象)Foo()
:
SomeDerived obj = new SomeDerived(); obj.Foo(); // runs the new code SomeBase objBase = obj; // still the same object objBase.Foo(); // runs the old code
这显然会对任何知道SomeDerived
和调用的现有代码产生影响Foo()
- 即它现在运行的方法完全不同.
另外,请注意您可以标记它protected internal
,并用于[InternalsVisibleTo]
提供对单元测试的访问(这是最常见的用途[InternalsVisibleTo]
;然后您的单元测试可以在没有派生类的情况下直接访问它.
关键是你没有改写方法.你在隐藏它.如果你覆盖它,你需要override
关键字(此时,除非它是虚拟的,否则编译器会抱怨,因为你不能覆盖非虚方法).
你使用new
关键字告诉编译器和任何阅读代码的人,"没关系,我知道这只是隐藏基本方法而不是覆盖它 - 这就是我的意思."
坦率地说,我认为隐藏方法很少是个好主意 - 我会使用不同的方法名称,就像Craig建议的那样 - 但这是一个不同的讨论.
您在没有名称的情况下更改了可见性.调用你的函数TestFoo,它会工作.是的,恕我直言,由于这个原因,子类是可以接受的.