用例隐藏使用new的方法

时间:2010-06-25 13:30:50

标签: c#

这或多或少是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"

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

1 个答案:

答案 0 :(得分:4)

我们的想法是尽可能避免brittle base class问题。

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

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

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