这或多或少是this post的完全重复,但由于我无法编辑,我开始这样做。随意移动一些东西并关闭它。
使用隐藏新方法似乎是一个危险的功能,并且在另一个帖子中进行了讨论,似乎不仅是我在找到有效的用例方面遇到了问题。任何接受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"
那么有哪些新的有效用例很难用其他功能来解决?
答案 0 :(得分:4)
我们的想法是尽可能避免brittle base class问题。
假设您提供了一个库,我派生自您的一个类。我创建了自己的方法Foo()
,并适当地调用它。细
现在,您将介绍库的第二个版本,并将Foo()
方法(具有相同的签名)添加到基类。现在,您的代码将调用Foo()
,它具有一个特定含义......并且可能与我的Foo()
方法的完全不同含义。默认行为(以及添加new
修饰符时的行为)是为了使事情按照应有的方式运行:只知道基类的代码将调用您的方法 - 这很好,因为这就是它们的意思。使用具有我的派生类的编译时类型的表达式的代码将使用 my 方法 - 这很好,因为它们它们应该也意味着什么。 (基本上它只能是我的代码,因为只有我的代码知道我的类。)
它应该通常可以避免 - 它可以导致微妙的错误,改变编译时类型的变量会默默地改变行为......但它存在于这种情况。基本上,向基类添加方法不应该尽可能地破坏派生类。