new和override都可以覆盖父类的方法,但两者又有所区别。
子类使用new覆盖父类方法后,是独立于父类的方法。
子类使用override覆盖父类的方法后,只是在调用时不再调用父类方法而调用子类方法。
我们来看一段代码
public class Parent { public void T1() { Debug.WriteLine("Parent T1"); } public virtual void T2() { Debug.WriteLine("Parent T2"); } } public class Child : Parent { public new void T1() { Debug.WriteLine("Child T1"); } public override void T2() { Debug.WriteLine("Child T2"); } }代码中定义了父类Parent和子类Child,方法T1使用new来覆盖,方法T2使用override来覆盖,下面是调用代码
var c = new Child(); c.T1(); c.T2(); var p = c as Parent; p.T1(); p.T2();执行结果如下图
可以看到,创建的Child实例,在执行T1和T2方法时,都执行的是Child中的方法。但是将该实例转换成父类时,T1执行的是Parent的T1方法,而T2执行的依旧是Child中的T2方法。这就说明,随着其类型的不同,用new关键字覆盖的方法执行其所在类的方法,而override覆盖的方法,不论是Child还是Parent,只要原始的实例是什么类型,就执行原始类型的方法。
所以new关键字覆盖的方法是独立存在的,override覆盖的方法是随实例调用的。
转载请注明出处。