博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中new和override区别
阅读量:5752 次
发布时间:2019-06-18

本文共 2131 字,大约阅读时间需要 7 分钟。

在C#中实现重写方法,可以用new和override两个关键字来实现,究竟他们之间有什么区别呢?下面,我以例子来说明他们之间的微妙区别:
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()");
        }
}

  下面的调用代码:

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();
}

  结果是这样的:

[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是直正意义上的重载. 

转载地址:http://shkkx.baihongyu.com/

你可能感兴趣的文章
公司新年第一次全员大会小记
查看>>
最懒的程序员
查看>>
JAVA8 Stream 浅析
查看>>
inner join on, left join on, right join on要详细点的介绍
查看>>
SAS vs SSD对比测试MySQL tpch性能
查看>>
Spring boot 整合CXF webservice 全部被拦截的问题
查看>>
Pinpoint跨节点统计失败
查看>>
【Canal源码分析】Canal Server的启动和停止过程
查看>>
机房带宽暴涨问题分析及解决方法
查看>>
iOS 绕过相册权限漏洞
查看>>
我的友情链接
查看>>
XP 安装ORACLE
查看>>
八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
查看>>
[转载] 中华典故故事(孙刚)——19 万岁
查看>>
修改hosts文件里面的主机名,oralce asm无法启动
查看>>
Maven学习总结(十)——使用Maven编译项目gbk的不可映射问题
查看>>
php5编译安装常见错误和解决办法集锦
查看>>
Linux远程访问及控制
查看>>
MongoDB实战系列之五:mongodb的分片配置
查看>>
Unable to determine local host from URL REPOSITORY_URL=http://
查看>>