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

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. 基于promtheus的监控解决方案

    一.前言 鄙人就职于某安全公司,团队的定位是研发安全产品云汇聚平台,为用户提供弹性伸缩的云安全能力.前段时间产品组提出了一个监控需求,大致要求:平台对vm实行动态实时监控,输出相应图表界面,并提供警报 ...

  2. RPC基于http协议通过netty支持文件上传下载

    本人在中间件研发组(主要开发RPC),近期遇到一个需求:RPC基于http协议通过netty支持文件上传下载 经过一系列的资料查找学习,终于实现了该功能 通过netty实现文件上传下载,主要在编解码时 ...

  3. 《HelloGitHub》第 26 期

    公告 五月初 hellogithub.com 网站做了优化和试错.因为我个人能力原因,导致这段时间网站出现了间断性不能访问,现在问题已经修复.多谢大家的支持.理解和反馈. 本期新增了"星图& ...

  4. nuxt Window 或 Document未定义解决方案

    概述 在用nuxt开发服务端渲染项目并引入第三方库的时候,经常会遇到window或document未定义的情况,原因是这个第三方库里面用到了window或者document,然后在服务端打包的时候,n ...

  5. netcore程序部署到docker

    1.基础准备 1. ubuntu 18.04 2. docker version 18.09 3. netcore 2.1 2.简介 自从netcore支持跨平台之后,以及现在很多公司都是采用容器化部 ...

  6. 产品管理开发之Git工作流和分支规范推荐

    前言 无论是开源项目还是内部项目,使用Git都是大势所趋,尤其是在产品管理这块,使用Git大大提高了开发效率和产品的交付频率.本篇,针对Git的工作流和分支使用,进行了一些推荐. 目录 1     产 ...

  7. js初级入门

    javascript的数据类型 (symbol)一.原始数据类型 或 基本数据类型 6种 1,undefined (1,申明未赋值,2,函数没有返回值)2,null (空,不存在)3,number ( ...

  8. nn.ConvTranspose2d的参数output_padding的作用

    参考:https://blog.csdn.net/qq_41368247/article/details/86626446 使用前提:stride > 1 补充:same卷积操作 是通过padd ...

  9. Abp通用配置模块的设计

    引言 约定优于配置,配置趋于灵活 约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处, ...

  10. Python写爬虫爬妹子

    最近学完Python,写了几个爬虫练练手,网上的教程有很多,但是有的已经不能爬了,主要是网站经常改,可是爬虫还是有通用的思路的,即下载数据.解析数据.保存数据.下面一一来讲.   1.下载数据 首先打 ...