用于使用new隐藏方法的用例

这或多或少是这篇文章的完全重复,但由于我无法编辑它,我开始这样做。 随意移动一些东西并关闭这个。

使用隐藏new的方法似乎是一个危险的特性,并且在另一个线程中进行了讨论,似乎不仅是我在找到有效的用例方面遇到了问题。 接受Base的任何方法都不会使用Derived方法。

public class Base { public void Method() { Console.WriteLine("Base"); } } public class Derived : Base { public new void Method() { Console.WriteLine("Derived"); } } var derived = new Derived(); derived.Method(); // "Derived" ((Base)derived).Method(); // "Base" 

那么有哪些新的有效用例很难用其他function来解决?

我们的想法是尽可能避免脆弱的基类问题。

假设您提供了一个库,我派生自您的一个类。 我创建自己的方法, Foo() ,并适当地调用它。 精细。

现在,您将介绍库的第二个版本,并将Foo()方法(具有相同的签名)添加到基类。 现在你的代码将调用Foo() ,它有一个特殊含义……这可能与我的Foo()方法完全不同 。 默认行为(以及添加new修饰符时的行为)是为了使事情按照应有的方式运行:只知道基类的代码将调用您的方法 – 这很好,因为这就是它们的意思。 使用具有我的派生类的编译时类型的表达式的代码将使用我的方法 – 这很好,因为这也是他们应该的意思。 (基本上它只能是我的代码,因为只有我的代码知道我的类。)

通常应该避免它 – 它可能导致细微的错误,改变编译时类型的变量会默默地改变行为……但它存在于这种情况下。 基本上,向基类添加方法不应该尽可能地破坏派生类。