先放出来两个基类和派生类:

public class BaseClass
{
  public virtual void Method1(string desc)
  {
    Console.WriteLine(desc + ": Base - Method1");
  }   public void Method2(string desc)
  {
    Console.WriteLine(desc + ": Base - Method2");
  }
} public class DerivedClass : BaseClass
{
  public override void Method1(string desc)
  {
    Console.WriteLine(desc + ": Derived - Method1");
  }   public new void Method2(string desc)
  {
    Console.WriteLine(desc + ": Derived - Method2");
  }
}

new除了可以创建对象和作为泛型约束之外,还可以作为方法的修饰符,这里讨论的是作为方法的修饰符时与override的异同:

  • new和override作用于相同的方法签名(方法名相同,参数个数、顺序、类型相同)
  • new用于隐藏父级方法。当派生类从一个基类继承并有一个相同签名的方法时,派生类的方法会显示有一个编译警告,提示要隐藏基类方法的话那就用new来修饰。就是说用new之后派生类这方法是派生类的而已,与基类无关了。
  • override用于重写基类方法。当派生类从一个基类继承并有一个相同签名的方法时,如果基类方法是可重写的(方法被virtual、abstract或override修饰),则基类的方法将被派生类重写(覆盖)。就是说用override之后派生类的方法派生类自己重新实现了,基类的方法也被派生类的替代了。
  • new和override这两个关键字是互斥的。不可以同时使用。

两者该怎么用呢?且看上面两个父子类。DerivedClass继承了BaseClass,Method1重写了基类的,Method2隐藏了基类的。

单纯地var bc = new BaseClass();或var dc = new DerivedClass();调用的是各自的方法,这点不用讨论了。当BaseClass bcdc = new DerivedClass();时,这里发生了一次向上转型,bcdc从DerivedClass转型为其上级(基类)BaseClass类型;实例bcdc.Method1调用的将是DerivedClass的方法,因为在实例化的时候Method1已经被重写(override)过了;而bcdc.Method2调用的将是BaseClass的方法,因为Method2没有被动到,依然是BaseClass原来的方法。

总结起来就是:在派生类中,相同签名的方法基类的也要重写(影响到)的话就是用override,只想派生类实现给自己的话(不影响基类)就用new。这样实例向上转型后override的会被保留(因为已经被派生类重写),new的会使用基类原来的方法。

关于C#的new与override的更多相关文章

  1. Java高并发系列——检视阅读

    Java高并发系列--检视阅读 参考 java高并发系列 liaoxuefeng Java教程 CompletableFuture AQS原理没讲,需要找资料补充. JUC中常见的集合原来没讲,比如C ...

  2. Scala override

    var 变量不能在子类中重写,除非父类是抽象类 在抽象类中var变量不能赋初值 abstract class Person{ val name="" def name1=" ...

  3. [转]How to override HandleUnauthorizedRequest in ASP.NET Core

    本文转自:http://quabr.com/40446028/how-to-override-handleunauthorizedrequest-in-asp-net-core I'm migrati ...

  4. overload、overwrite、override

    1.重载 overload 函数名一样,参数不同(类型.顺序,与返回值类型无关),重载的函数一般在同一个类中 class A { public: void test() {} void test(in ...

  5. 转: Delphi的OverRide、OverLoad和Virtual方法

    http://blog.csdn.net/ckli/article/details/2201418 override 重写 也叫覆盖 .方法的重写Overriding和重载Overloading是Ja ...

  6. Java中@Override的作用

    @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读:2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例如 ...

  7. 扩:new and override

    昨天有个网友问我继承里面的new和override关键词有啥区别,呃,我们来看个例子就知道了 new ==>隐藏父类同名方法  override==>覆盖 定义一个父类: public c ...

  8. sealed、new、virtual、abstract与override 趣解

    1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于 方法或属性时,sealed修饰符必须始终与override一起使用. ...

  9. C#基础知识四之override和new的区别

    override override是派生类用来重写基类方法的.调用的派生类方法,如需调用基类方法用base关键字 override不能重写非虚方法或静态方法. override重写必须用abstrac ...

  10. Overload 和Override 的区别

    Overload 是重载的意思,Override 是覆盖的意思,也就是重写.重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同).重写 ...

随机推荐

  1. AngularJs 服务 广播

    1, angularJs的服务有provider,Service, Factory. Factory是对Service的封装,Service是对Provider的封装. Provide的源码如下: f ...

  2. spring 上传文件文件的一个例子,

    /** * 类名称:UploadTest 类描述:创建人:zhang 创建时间:2015年3月13日 下午4:20:57 修改人:zhang * 修改时间:2015年3月13日 下午4:20:57 修 ...

  3. Docker 镜像之进阶篇

    笔者在<Docker 基础 : 镜像>一文中介绍了 docker 镜像的基本用法,本文我们来介绍 docker 镜像背后的技术原理. 什么是 docker 镜像 docker 镜像是一个只 ...

  4. 你真的了解String吗?(修正版)

    修正前:new出来的对象,会在堆中存放真正的值: 大错特错!!!! 修正后:new出来的对象,堆存放的并不是真正的值,而是常量池中字符串常量的地址. 一.抛砖引玉 ​ 不知道大家在做面试题时是否会遇到 ...

  5. Java Native Interface调用C++代码

    概述 Java Native Interface译为Java原生接口,简称JNI.Java并不是完美的,它的不足体现在运行速度要比传统的C++慢上许多,并且无法直接访问到操作系统底层,为此Java提供 ...

  6. 【工具篇】抓包中的王牌工具—Fiddler (1-环境搭建)

    导言 在现在高速发展的互联网时代,抓包工具被广泛应用在软件开发的项目中,Fiddler可谓是当下主流的抓包工具之一.测试人员用它来抓包.回放测试记录,构造发包测试用例,开发人员用来定位问题,其强大的功 ...

  7. 【Python3爬虫】用Python中的队列来写爬虫

    一.写在前面 当你看着你的博客的阅读量慢慢增加的时候,内心不禁有了些小激动,但是不得不吐槽一下--博客园并不会显示你的博客的总阅读量是多少.而这一篇博客就将教你怎么利用队列这种结构来编写爬虫,最终获取 ...

  8. 介绍几款 Python 类型检查工具

    近日,微软在 Github 上开源了一个 Python 静态类型检查工具:pyright ,引起了社区内的多方关注. 微软在开源项目上的参与力度是越来越大了,不说收购 Github 这种大的战略野心, ...

  9. 跟踪测试 DbContext ,向"不是真正的 ORM" 说拜拜

    FreeSql 发展到现在,已经有两种稳定的开发模式,以下先简单带过一下.后面才是本文的主题. 方法一:基于 helper 的方式,祼用: dotnet add package FreeSql 提供 ...

  10. 用Docker解决坑爹的环境搭建系列——PHP+Apache2

    sudo docker pull eboraas/apache-php sudo docker run -p 9991:80 --name php -v /data/docker/php/www:/v ...