浅谈c#中new和override的用法区别

来源:互联网 发布:软件培训基地 编辑:程序博客网 时间:2024/05/15 04:10

http://hi.baidu.com/xiaoxiao_luo/item/a2b86f0ca468e796a3df43fb

首先,我引用《c#程序设计实用教程》中的一句话:"关键字new和override的区别:new修饰的方法表示显式隐藏基类继承的同名方法,不能够用基类的引用访问派生类的new方法;override表示重写基类的虚方法,可以用基类的引用指向派生类的重写方法。"

   要理解这句话,你必须知道句子中的几个关键字:
  
1.显式隐藏
   2.用基类的引用访问派生类的new方法
   3.重写
   下面我来一一解释清楚,明白后,new和override的区别也就清楚了。
   看两张图片,也许大家就会明白很多。

        .....................................................................................................


大家比较一下,应该明白了第一个和第三个关键字的含义了吧
显示隐藏:new后,子类的method1()会同时和父类的method1()同时存在,但当使用子类的时候调用子类的method1()方法,而不会调用父类的method1(),后面我在详细解释一下
什么时候调用父类的method1().
重写:override后,子类继承父类的method1(),并完全的改写此方法。

下面在解释一下“.用基类的引用访问派生类的new方法”,
public class animal
    {
        public virtual void sleep()
        {
            Console.WriteLine("animal all need sleep");
        }
    }
    public class fish : animal
    {
        public override void sleep()
        {
            Console.WriteLine("fish sleeping with eye_open");
        }
    }
    public class dog : animal
    {
        public override void sleep()
        {
            Console.WriteLine("dog sleeping with eye_closed");
        }
    }
那么现在我们可以在mian函数中执行下面的代码
animal fj1=new animal();
animal fj2=new fish();
animal fj3=new dog();
fj1.sleep();
fj2.sleep();
fj3.sleep();
输出:
animal all need sleep
fish sleeping with eye_open
dog sleeping with eye_closed

如果你用new取代override(这时候父类中就去掉关键字virtual),还是上面的代码:
输出结果:
animal all need sleep
animal all need sleep
animal all need sleep
     主要是因为“animal fj1=new animal();”中用animal去实例化它的子类对象,在调用方法的时候它会调用父类的method1()方法,而不是调用子类的method1()方法。
这也解决了前面的什么时候调用父类的method1()方法的问题。
有什么不对的地方,恳求指点。