美文网首页
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的区别

    先看如下实例代码: 输出结果: override即覆盖重写的意思,指子类继承父类后,重写并覆盖了父类的某个方法,子...

  • C#中的override和new的区别

    之前做项目很少用到虚方法,并且自己还一直存在一个误解:虚方法只能放在抽象类中。其实虚方法和抽象类没有必然的关...

  • c#中virtual、override、new的区别

    Virtual 用于父类中,声明某方法可以重写,该方法不能是static; override(覆盖继承) 用于子类...

  • c# new与override

    override关键字表示重写(覆盖),对于加上override关键字的属性或函数将完全覆盖基类的同名虚属性或虚函...

  • Unity基础-脚本生命周期

    1.Unity脚本 和 C#脚本区别? unity脚本继承自MonoBehavior。 unity脚本不能new。...

  • 一道面试题的思考

    在继承中new和override相同点和区别?看下面的代码,有一个基类A,B1和B2都继承自A,并且使用不同的方式...

  • C#基础-方法的重写(new)和覆盖(override)

    最近又再看基础知识了。 看到方法的重写(new)和覆盖(override)的时候有点不太懂。 于是百度之。 那答案...

  • Java 拾遗三

    1. Override 和 Overload 的含义去区别 Override(重写) 重写(Overriding)...

  • 2秒后跳转

    new Thread(new Runnable(){ @Override public v...

  • 我所理解的多线程

    我所理解的多线程。 new Thread(new Runnable() { @Override public ...

网友评论

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

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