覆盖父类方法的new和override关键字

new和override均可以覆盖父类的方法,但二者又有所区别。web

子类使用new覆盖父类方法后,是独立于父类的方法。ide

子类使用override覆盖父类的方法后,只是在调用时再也不调用父类方法而调用子类方法。svg

咱们来看一段代码spa

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来覆盖,下面是调用代码.net

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,只要原始的实例是什么类型,就执行原始类型的方法。code

因此new关键字覆盖的方法是独立存在的,override覆盖的方法是随实例调用的。xml


转载原文:https://blog.csdn.net/xxdddail/article/details/75599179blog