快速业务通道

把new、virtual、override说透 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19

把new、virtual、override说透

时间:2011-02-07 csdn博客 周公

我们先看下面一段程序:

/// <summary>    /// 父类 /// 作者:周公 /// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx /// 日期:2008-09-01    /// </summary>    public class Father    {      public void Run0()      {        Console.WriteLine("Father.Run0");      }    }    /// <summary> /// 子类 /// 作者:周公 /// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx /// 日期:2008-09-01    /// </summary>    public class Son:Father    {      public void Run0()      {        Console.WriteLine("Son.Run0");      } } class Program    {      static void Main(string[] args)      {      Father[] fatherList = new Father[2];        fatherList[0] = new Father();        fatherList[1] = new Son();        fatherList[0].Run0();        fatherList[1].Run0();    } }

程序的运行结果是:

Father.Run0 Father.Run0

稍微细心的朋友可能发现在Son类的Run0方法下面有一段棕色的波浪线,当我们把鼠标放到该下划线上时,会看到下面的提示(编译程序时在程序的“输出”窗口也能看到这个警告):

“MethodDemo.Son.Run0()”隐藏了继承的成员“MethodDemo.Father.Run0()”。如果是有意隐藏,请使用关键字new。

如图:

把new、virtual、override说透(2)

时间:2011-02-07 csdn博客 周公

然后我们再来第二个版本的Run方法,我们称之为Run1(),,与第一个版本的区别是在子类的同名同参(方法名相同,参数个数和参数顺序相同,下同)方法前面加上了一个new关键字,代码如下:

/// <summary>    /// 父类 /// 作者:周公 /// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx /// 日期:2008-09-01   /// </summary>    public class Father    {      public void Run1()      {        Console.WriteLine("Father.Run1");      }    }    /// <summary> /// 子类 /// 作者:周公 /// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx /// 日期:2008-09-01    /// </summary>    public class Son:Father    {      public new void Run1()      {        Console.WriteLine("Son.Run1");      } } class Program    {      static void Main(string[] args)      {      Father[] fatherList = new Father[2];        fatherList[0] = new Father();        fatherList[1] = new Son();        fatherList[0].Run1();        fatherList[1].Run1();    } }

运行结果如下:

Father.Run1 Father.Run1

我们发现加上new关键字之后,程序的运行结果没有发生改变。也就是在C#中,如果在子类中有与父类同名同参的方法时,C#会隐式帮你在子类的方法前面添加一个new关键字。

我们再写第三个版本的Run方法,即Run2(),与第一个版本不同的是父类的Run2()方面前面加了一个virtual关键字,表示这是一个虚方法,子类的Run2()除了与第一个版本号不同之外(Run0()改成Run2())没有什么不同。

把new、virtual、override说透(3)

时间:2011-02-07 csdn博客 周公

程序代码如

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号