这或多或少是this post的复制品,但由于我不能编辑它,所以我开始编辑它。你可以随意移动一些东西,然后关闭它。
在new中使用方法隐藏似乎是一个危险的特性,而且在另一个线程中的讨论中,似乎不只是我一个人在寻找有效的用例方面有问题。任何接受Base的方法都不会使用派生的方法。
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"那么,有哪些新的有效用例是难以用其他功能解决的呢?
发布于 2010-06-25 21:39:03
这个想法是为了尽可能避免问题。
假设您提供了一个库,而我派生自您的一个类。我创建了自己的方法Foo(),并适当地调用它。很好。
现在引入库的第二个版本,并将Foo()方法(具有相同的签名)添加到基类中。现在您的代码将调用Foo(),它有一个特殊的含义...与我的Foo()方法相比,这可能是完全不同的含义。默认行为(以及添加new修饰符的行为)是为了让事情按照它们应该的方式运行:只知道基类的代码将调用您的方法--这很好,因为这就是它们的意思。使用具有我的派生类的编译时类型的表达式的代码将使用我的方法-这很好,因为这也应该是它们的意思。(基本上它只能是我的代码,因为只有我的代码知道我的类。)
通常应该避免它-它可能会导致细微的bug,即更改变量的编译时类型会默默地更改行为……但它是为那种情况而存在的。基本上,向基类添加方法应该尽可能不会破坏派生类。
https://stackoverflow.com/questions/3118372
复制相似问题