C#中的覆盖和新关键字有什么区别?
在类层次结构中定义方法时,C#中的override
和new
关键字有什么区别?
以下页面非常好地总结您的问题。
知道何时使用覆盖和新的关键字
概要
覆盖 :在派生类中重写基类的方法时,即使调用代码没有“知道”该对象是派生类的实例,也会使用派生类中的版本。
新增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的方法。 有了virtual
和override
,但是,它的工作原理。
我强烈build议你避免new
; 最好的情况是混淆,因为你正在定义一个名称可以被认为是别的东西的方法,最糟糕的是,它可以隐藏错误,引入看似不可能的错误,并使扩展function变得困难。
看起来像一个老问题,让我试试不同的答案:
-
new
:正如名称所述,它是inheritance层次系列中的新成员,并且将用作进一步向下链(如果标记为虚拟)的基本成员。 -
override
:这意味着我不接受我父类的成员实现,我会做不同的。
override
允许你重写一个基类中的虚拟方法,这样你就可以放入一个不同的实现new
将会隐藏一个非虚方法到一个基类中。