当前位置:  开发笔记 > 编程语言 > 正文

如果打算隐藏,请使用新关键字

如何解决《如果打算隐藏,请使用新关键字》经验,为你挑选了3个好方法。

我有以下代码片段在VS2008中生成"如果隐藏意图使用新关键字"警告:

public double Foo(double param)
{
   return base.Foo(param);
}

Foo()基类中的函数受到保护,我想将它暴露给单元测试,方法是将它放在包装类中,仅用于单元测试.即包装类不会用于其他任何东西.所以我有一个问题是:一种公认的做法吗?

回到new警告.为什么我必须在这种情况下更新覆盖功能?



1> Marc Gravell..:

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];然后您的单元测试可以在没有派生类的情况下直接访问它.



2> Jon Skeet..:

关键是你没有改写方法.你在隐藏它.如果你覆盖它,你需要override关键字(此时,除非它是虚拟的,否则编译器会抱怨,因为你不能覆盖非虚方法).

你使用new关键字告诉编译器和任何阅读代码的人,"没关系,我知道这只是隐藏基本方法而不是覆盖它 - 这就是我的意思."

坦率地说,我认为隐藏方法很少是个好主意 - 我会使用不同的方法名称,就像Craig建议的那样 - 但这是一个不同的讨论.



3> Craig Stuntz..:

您在没有名称的情况下更改了可见性.调用你的函数TestFoo,它会工作.是的,恕我直言,由于这个原因,子类是可以接受的.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有