您的位置:首页 > 编程语言 > C#

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

2008-03-24 17:19 423 查看
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()方法的问题。
有什么不对的地方,恳求指点。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# class