C#中的覆盖和新关键字有什么区别?

在类层次结构中定义方法时,C#中的overridenew关键字有什么区别?

以下页面非常好地总结您的问题。

知道何时使用覆盖和新的关键字

概要

覆盖 :在派生类中重写基类的方法时,即使调用代码没有“知道”该对象是派​​生类的实例,也会使用派生类中的版本。

新增function :如果使用new关键字而不是override,则派生类中的方法不会覆盖基类中的方法,而只是隐藏它。

如果你没有指定新的或者覆盖,结果输出和你指定的新输出是一样的,但是你也会得到一个编译器警告(因为你可能不知道你隐藏了一个基类的方法方法,或者实际上你可能想重写它,只是忘了包含关键字)。

覆盖 :与基类中的虚拟/抽象/覆盖types的方法一起使用

新增function :当基类没有声明方法为虚拟/抽象/重写

new将会用一个全新的方法(可能有也可能不具有相同的签名)而不是覆盖它(在这种情况下新方法必须具有相同的签名)来影响该方法,这意味着多态性将不起作用。 例如,你有这些类:

 class A { public virtual int Hello() { return 1; } } class B : A { new public int Hello(object newParam) { return 2; } } class C : A { public override int Hello() { return 3; } } 

如果你这样做:

 A objectA; B objectB = new B(); C objectC = new C(); Console.WriteLine(objectB.Hello(null)); // 2 Console.WriteLine(objectC.Hello()); // 3 objectA = objectB; Console.WriteLine(objectA.Hello()); // 1 objectA = objectC; Console.WriteLine(objectA.Hello()); // 3 

由于您可以使用new定义新的方法签名,因此编译器不可能知道A的实例实际上是B一个实例,并且新定义的方法B应该可用。 当父对象的方法,属性,字段或事件不是用virtual函数声明的时候,可以使用new ,而且由于缺乏virtual函数,编译器不会“查找”inheritance的方法。 有了virtualoverride ,但是,它的工作原理。

我强烈build议你避免new ; 最好的情况是混淆,因为你正在定义一个名称可以被认为是别的东西的方法,最糟糕的是,它可以隐藏错误,引入看似不可能的错误,并使扩展function变得困难。

看起来像一个老问题,让我试试不同的答案:

  1. new :正如名称所述,它是inheritance层次系列中的新成员,并且将用作进一步向下链(如果标记为虚拟)的基本成员。

  2. override :这意味着我不接受我父类的成员实现,我会做不同的。

override允许你重写一个基类中的虚拟方法,这样你就可以放入一个不同的实现new将会隐藏一个非虚方法到一个基类中。