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

时间:2012-03-06 19:10:31

标签: c# override new-operator

  

可能重复:
  C# keyword usage virtual+override vs. new
  Difference between new and override?

所以我一直致力于一个项目,并决定阅读C#中newoverride关键字之间的区别。

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

出于好奇心而不是任何事情,有new关键字是正确的方式吗?

3 个答案:

答案 0 :(得分:7)

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

让我澄清一下。请考虑以下事项:

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

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

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

Base instance = new Child();
instance.DoSomething(); // may expect "Child" but writes "Base"

答案 1 :(得分:1)

new给你的一件事是能够使它看起来好像你可以覆盖一个未声明为虚拟的方法。请记住,您没有覆盖,但实际上声明了一个具有相同名称的方法。

要使用override,必须将方法标记为virtualabstract

public class PolyTest
{
    public void SomeMethod()
    {
        Console.WriteLine("Hello from base");
    }
}

public class PolyTestChild : PolyTest
{
    new public void SomeMethod()
    {
        Console.WriteLine("Hello from child");
    }
}

关于你对buggy代码的评论,如果基础实现正在做你或者调用者所期望的事情,那就是bug的地方。 然而,我认为这不会比没有调用base.SomeMethod(当覆盖时)更危险而且你需要。

答案 2 :(得分:0)

new有它的位置,如果您不知道如何使用它,它只被视为纠正错误代码的好方法

一个例子:

public class A
{
    public void AMethod() { }
}

public class B : A
{
    public override void AMethod() { }
}

在这种情况下,AMethod无法覆盖B,因为它不是virtualabstract,因此为了提供自定义实施,您必须< / strong>使用new