前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#中new和override区别

C#中new和override区别

作者头像
用户4766018
发布2022-08-19 08:32:09
2760
发布2022-08-19 08:32:09
举报
文章被收录于专栏:格物致知

在C#中实现重写方法,可以用new和override两个关键字来实现,究竟他们之间有什么区别呢?下面,我以例子来说明他们之间的微妙区别:

代码语言:javascript
复制
 public class GrandClass   //基类
 {   
 public GrandClass()   
 {   
 Console.WriteLine("In GrandClass.Constructor");   
 }   
 public virtual void Method()   //用virtual才可以在子类中用override,而new不需要这样 
 {   
 Console.WriteLine("In GrandClass.Method()");   
 }   
 }   
 
 public class ParentClass:GrandClass   //继承基类,看看override状态
 {   
 public ParentClass()   
 {   
 Console.WriteLine("In ParentClass.Constructor");   
 }   
 public override void Method()   //使用override,是说把基类的方法重新定义
 {   
 Console.WriteLine("In ParentClass.Method() use override");   
 }   
 }   
 
 public class NewParentClass:GrandClass   //继承基类,看看new状态 
 {   
 public NewParentClass()   
 {   
 Console.WriteLine("In NewParentClass.Constructor");   
 }   
 new public void Method()   //使用new,不是说用到基类的方法,而是重新定义一个子类方法,只不过,方法名称与基类相同 
 {   
 Console.WriteLine("In NewParentClass.Method()");   
 }   
 }  

  下面的调用代码:

代码语言:javascript
复制
  static void Main()    
 {   
 GrandClass Parent=(GrandClass)   new ParentClass();   //用override子类加框一个基类对象句柄
 Parent.Method();   
 GrandClass NewParent=(GrandClass)   new NewParentClass();   //用new子类加框一个基类对象句柄 
 NewParent.Method();   
 NewParentClass NewParent1=   new NewParentClass();   //一个子类句柄
 NewParent1.Method();   
 }  

  结果是这样的:

代码语言:javascript
复制
  [1]In GrandClass.Constructor   
 [2]In ParentClass.Constructor   
 [3]In ParentClass.Method() use override   
 [4]In GrandClass.Constructor   
 [5]In NewParentClass.Constructor   
 [6]In GrandClass.Method()   
 [7]In GrandClass.Constructor   
 [8]In NewParentClass.Constructor   
 [9]In NewParentClass.Method()  

  结果前的序号是我自己加的.为了以下的分析:   [1],[2]两句是GrandClass Parent=(GrandClass)new ParentClass();的结果.(注意一下子类构建器与基类构建器的初始化顺序)   [3]是Parent.Method();结果.   [4],[5]两句是GrandClass NewParent=(GrandClass)new NewParentClass();的结果.   [6]是NewParent.Method();的结果.   [7],[8]两句是GrandClass NewParent1=(GrandClass)new NewParentClass();的结果.   [9]是NewParent1.Method();的结果.   这里我们可以看到,同样是用子类的对象构造一个基类句柄.结果却很明显,可以看到[3]和[6]的区别.[3]调用了子类的Method(),而[6]调用了基类的Method().   这说明,override可以覆盖基类的方法,让基类的方法以子类的内容实现,而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已. 而这一例子的基础是建立在用子类对象加框成基类对象的,目的是实现用基类句柄调用子类方法,以实现重载的多形性.   如果想调用子类的new方法,用子类的句柄(绝对不能用基类句柄)来调用.结果[9]可以看出来.   用new是在为子类定义方法名时,实在没有办法定义方法名的情况才与基类的方法相同,但这个方法只在子类中起到作用,而不影响基类的方法.也就是说,new方法就是子类新定义的方法.用override是直正意义上的重载.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011/08/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档