C# new 和 override 的区别

在C#中子类继承抽象类的时候,new 和override都可以用来修饰子类方法,但两者之间是有区别的。

相同点:

  1. 它们都是子类在覆写基类方法时,修饰子类同名方法用的,都是为了隐藏基类的同名方法
  2. 在实例化子类对象的时候,访问的都是子类的方法
  3. 都可以在方法体中通过base来访问基类的方法

不同点:

  1. override用于重写基类的virtual方法,必须要申明override关键字,而new可以省略
  2. override会覆盖掉基类的同名方法,除非是在子类方法中用base访问基类方法,除此以外,再也无法访问基类方法。而new还是可以用通过其它方法访问到基类方法

怎么选择new还是override?

  1. 我们通常认为,基类的virtual方法是不完善的,只提供了基础的的申明和实现,override的方法,通常才是完善和可用,一般不希望去调用基类的虚方法,所以当我们只是需要这样简单的约定的时候,就会采用override的方式来覆写
  2. 什么时候用new?当基类的方法已经很完善,并且有可能在某种情况下需要调用的时候,我们就用new,这个时候new只是作为一种隐藏基类的方法和对基类同名方法的进一步扩展,基类的方法同样是有意义并且可以被调用的

下面是代码示例:

using System;
namespace TestNamespace
{
    // 基类
    public abstract class BaseClass
    {
        public string DoSomething()
        {
            return "BaseClass.DoSomething()";
        }
        public virtual string DoSomething2()
        {
            return "BaseClass.DoSomething()2";
        }
    }
    
    // 子类
    public partial class ChildClass : BaseClass
    {
        public new string DoSomething()
        {
            return "ChildClass. DoSomething()";
            //return base.DoSomething();
        }

        public override string DoSomething2()
        {
            return "ChildClass. DoSomething()2";
            //return base.DoSomething2();
        } 
    }
}

调用方法: 

/
ChildClass child = new ChildClass();
child.DoSomething(); // 调用子类同名方法DoSomething()
child.DoSomething2() // 调用子类同名方法DoSomething2()

/
BaseClass child = new ChildClass();
child.DoSomething(); // 调用基类同名方法DoSomething()
child.DoSomething2() // 调用子类同名方法DoSomething2()


从上面的代码示例中可以发现,一旦基类的虚方法被override,我们就无法再访问基类的DoSomething()方法,除非是在子类方法中用base.DoSomething()去访问,但对于new修饰的子类同名方法,我们还是可以访问。

你可能感兴趣的:(c#)