美文网首页
C#中new和override的区别

C#中new和override的区别

作者: 向着远方奔跑 | 来源:发表于2018-03-17 00:03 被阅读0次

    先看如下实例代码:

    class Base  //父类
    {  
        public virtual void F1()  
        {  
            Console.WriteLine("Base's virtual function F1");  
        }  
        public virtual void F2()  
        {  
            Console.WriteLine("Base's virtual fucntion F2");  
        }  
    }  
    class Derived:Base  //子类继承父类
    {  
        public override void F1()  
        {  
            Console.WriteLine("Derived's override function F1");  
        }  
        public new void F2()  
        {  
            Console.WriteLine("Derived's new function F2");  
        }  
    }  
    class Program  
    {  
        public static void Main(string[] args)  
        {  
            Base b1 = new Derived();  
            //由于子类覆盖了父类的方法,因此这里调用的是子类的F1方法。也是OO中多态的体现  
            b1.F1();  
            //由于在子类中用new隐藏了父类的方法,因此这里是调用了隐藏的父类方法  
            b1.F2();     
        }  
    }  
    

    输出结果:

    Derived's override function F1
    Base's virtual function F2  
    
    • override
      覆盖重写的意思,指子类继承父类后,重写并覆盖了父类的某个方法,子类对象无法再访问父类中的该方法。
      如上例子:
      Base b1 = new Derived();
      意思为创建了一个父类Base类的引用b1,使其指向子类Derived类的一个对象,此时b1可以调用Base类中的除被Derived类重写的方法或属性之外的所有的属性和方法以及Derived类中被Derived类重写的方法和属性
      因此b1.F1()调用的是子类Derived类中的F1方法,因为子类Derived类中重写了F1方法。
    • new
      隐藏的意思,是指子类显式的隐藏了父类的方法,new在此时是被用作声明修饰符,一般用于当子类需要使用父类中的方法或属性,但是其方法内容和值又不相同,此时,不用更改父类中的方法和属性,只需在子类中创建同名的方法和属性,并在前面加上声明修饰符new即可,这样当子类对象调用此方法或属性时,就调用的是子类中的方法或属性,因为加new之后,子类中的方法或属性相当于显式的隐藏了父类中的同名方法和属性。
      但加new仅仅只是隐藏了父类中的方法或属性而已
      Base b1 = new Derived();
      此时b1.F2()调用的就是父类中的F2方法,因为子类Derived类并没有重写父类中的F2方法,只是将其隐藏掉了,这样,指向子类对象的父类引用是无法调用没有被子类重写的方法或属性,所以,b1.F2()自然就调用的是父类中的F2方法
      如果Derived b1 = new Derived();
      则此时的b1.F2调用的就是子类Derived中的F2方法,还是因为其将父类中的F2方法隐藏掉了。

    总结:
    用override和new最大的分别就是
    用override时:当子类中重写了父类中的一个方法或属性,指向子类对象的父类引用调用的就是子类中的此方法或属性,而无法调用父类中的此方法或属性。要调用父类中的此方法或属性,只能通过父类对象的父类引用。当然,子类对象的子类引用此时调用的也是被子类重写的方法或属性。
    用new时:当子类中new了父类中的一个方法或属性,指向子类对象的父类引用调用的就是父类中的此方法或属性,而无法调用子类中的此方法和属性,当然父类对象的父类引用调用的也是父类中的此方法或属性。要调用子类中new过的此方法或属性,只能通过子类对象的子类引用来调用。

    相关文章

      网友评论

          本文标题:C#中new和override的区别

          本文链接:https://www.haomeiwen.com/subject/tcorqftx.html