C#中new和override的区别

先看如下实例代码:

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的区别)