Guy*_*Guy 54 c# inheritance warnings new-operator
我有以下代码片段在VS2008中生成"如果隐藏意图使用新关键字"警告:
public double Foo(double param)
{
return base.Foo(param);
}
Run Code Online (Sandbox Code Playgroud)
Foo()基类中的函数受到保护,我想将它暴露给单元测试,方法是将它放在包装类中,仅用于单元测试.即包装类不会用于其他任何东西.所以我有一个问题是:这是一种公认的做法吗?
回到new警告.为什么我必须在这种情况下更新覆盖功能?
Mar*_*ell 69
该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
Run Code Online (Sandbox Code Playgroud)
这显然会对任何知道SomeDerived和调用的现有代码产生影响Foo()- 即它现在运行的方法完全不同.
另外,请注意您可以标记它protected internal,并用于[InternalsVisibleTo]提供对单元测试的访问(这是最常见的用途[InternalsVisibleTo];然后您的单元测试可以在没有派生类的情况下直接访问它.
Jon*_*eet 38
关键是你没有改写方法.你在隐藏它.如果你覆盖它,你需要override关键字(此时,除非它是虚拟的,否则编译器会抱怨,因为你不能覆盖非虚方法).
你使用new关键字告诉编译器和任何阅读代码的人,"没关系,我知道这只是隐藏基本方法而不是覆盖它 - 这就是我的意思."
坦率地说,我认为隐藏方法很少是个好主意 - 我会使用不同的方法名称,就像Craig建议的那样 - 但这是一个不同的讨论.
| 归档时间: |
|
| 查看次数: |
66609 次 |
| 最近记录: |