何时使用new而不是覆盖C#

use*_*875 13 c# overriding new-operator

可能重复:
C#关键字使用情况虚拟+覆盖与新增
新和重写之间的差异?

所以我一直在研究一个项目,并决定阅读C#中关键字newoverride关键字之间的区别.

从我看到的情况来看,似乎使用new关键字功能是在代码中创建错误的好方法.除此之外,我真的不知道何时使用它真的有意义.

更多出于好奇心,有什么模式可以让new关键字成为正确的方法吗?

Jus*_*ner 7

new当您想要隐藏基础实现时,关键字是正确的方法,而您并不关心在以多态方式处理对象时无法调用方法.

让我澄清一下.考虑以下:

public class Base
{
    public void DoSomething()
    {
        Console.WriteLine("Base");
    }
}

public class Child : Base
{
    public new void DoSomething()
    {
        Console.WriteLine("Child");
    }
}
Run Code Online (Sandbox Code Playgroud)

有时,隐藏子类的功能是有益的,因此使用new关键字.问题是一些开发人员盲目地这样做会导致以下副作用(因此你提到的'bug'):

Base instance = new Child();
instance.DoSomething(); // may expect "Child" but writes "Base"
Run Code Online (Sandbox Code Playgroud)

  • @Joe - 我的意思确实不同。假设您有一个名为 Base 的基类,其中有一个名为 DoSomething 的方法。您在 Child 中继承 Base 并使用 new 关键字创建一个 DoSomething 方法。如果您执行以下操作:`Base base = new Child(); base.DoSomething();` 你将调用 `Base.DoSomething` 而不是 `Child.DoSomething`,因为你在 Child 中隐藏了基本实现而不是覆盖它。 (2认同)