C# new和override的区别

2021-04-02 15:27

阅读:396

标签:class   mil   类方法   stat   ase   soscw   line   基类   图片   

1 区别

override关键字表示重写(覆盖),对于加上override关键字的属性或函数将完全覆盖基类的同名虚属性或虚函数,使基类的虚属性和虚函数在整个继承链中都不可见(在子类中用base关键字调用除外)。

new表示隐藏,是指加上new关键字的属性或函数将对本类和继承类隐藏基类的同名属性或函数但是,通过一定的转换,是可以在子类的对象中访问父类同名属性或函数的。

2 例子

    

class Parent
    {
        public virtual void Func1()
        {
            Console.WriteLine("父类的虚函数Func1");
        }
        public virtual void Func2()
        {
            Console.WriteLine("父类的虚函数Func2");
        }
    }
    class Sun : Parent
    {
        public override void Func1()
        {
            Console.WriteLine("子类的实现函数Func1");
        }
        public new void Func2()
        {
            Console.WriteLine("子类的实现函数Func2");
        }
    }
    class Program
    {
        public static void Main(string[] args)
        {
            Parent b1 = new Sun();
            b1.Func1();  //子类覆盖了父类的方法,调用子类的方法,是多态的体现
            b1.Func2();  //子类用new隐藏父类的方法,调用隐藏的父类方法
            Sun b2 = new Sun();
            ((Parent)b2).Func1();//子类覆盖了父类的方法,调用子类的方法,是多态的体现(会提示这种转换时多余的)
            ((Parent)b2).Func2();//子类用new隐藏父类的方法,调用隐藏的父类方法
            Console.ReadLine();
        }
    }

输出结果

技术分享图片

结果分析

在上面的例子中,由于Sun类中Func1覆盖(override)了父类Func1方法,因此即使转成父类的对象,仍旧调用子类的Func1方法。而由于子类SunFunc2方法只是(new)隐藏了父类的Func2方法,因此当强制转换成父类(Base)的对象去调用Func2方法时,就会调用了隐藏的父类的Func2方法。

C# new和override的区别

标签:class   mil   类方法   stat   ase   soscw   line   基类   图片   

原文地址:https://www.cnblogs.com/nanzhixin/p/9214705.html


评论


亲,登录后才可以留言!