浅谈C#中子类用new与override的区别

我们先看代码和运行结果,代码:

BaseClass.cs文件:

    public class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("Base Constructed Function");

        }

        public virtual void Execute()
        {
            Console.WriteLine("Base Virtual Execute Function");
        }

        public virtual void Execute2()
        {
            Console.WriteLine("Base Virtual Execute2 Function");
        }

    }

ChildClass.cs文件:

    public class ChildClass : BaseClass
    {
        public ChildClass()
        {
            Console.WriteLine("Children Constructed Function");
        }

        public override void Execute()
        {
            Console.WriteLine("Children Execute Function");
        }

        public new void Execute2()
        {
            Console.WriteLine("Children Execute2 Function");
        }

    }

Program.cs文件:

    class Program
    {
        static void Main(string[] args)
        {
            #region 直接创建子类对象
            ChildClass A = new ChildClass();
            A.Execute();
            A.Execute2();
            #endregion

            #region 使用父类型引用子类型
            BaseClass B = new ChildClass();
            B.Execute();
            B.Execute2();
            #endregion

            Console.ReadKey();
        }
    }

运行结果:

我们有发现:

C# override,重写,是指对父类中的虚方法(标记virtual)或抽象方法(标记为abstract)进行重写,实现新的功能,它必须与父类方法的签名完全一致,而且与父类方法的可访问性也必须一致,此关键字不可以用于重写非虚方法和静态方法,。

new,隐藏,是指在子类中重新定义一个签名与父类方法相同的方法,父类的同名方法只是被隐藏而未被覆盖,这个方法也可以不显示使用new修饰,只是编译时会弹出一个警告信息:如果是有意隐藏,请使用关键字new。