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

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. NavigationView头部设置监听事件

    直接写解决方法吧: 1.将XML里的静态引入删除: <android.support.design.widget.NavigationView android:id="@+id/nav ...

  2. Spring源码学习

    Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...

  3. 【工具篇】Selenium 学习实践(一)环境搭建

    一.环境搭建 (1)初学者最佳环境: Python 2.7 + Selenium 2+ Firefox 46 (2)喜欢尝新的环境: Python 3.6 + Selenium 3+ Firefox ...

  4. 初探机器学习之使用百度AI服务实现图片识别与相似图片

    一.百度云AI服务 最近在调研一些云服务平台的AI(人工智能)服务,了解了一下阿里云.腾讯云和百度云.其中,百度云提供了图像识别及图像搜索,而且还细分地提供了相似图片这项服务,比较符合我的需求,且百度 ...

  5. asp.net core系列 57 IS4 使用混合流(OIDC+OAuth2.0)添加API访问

    一.概述 在上篇中,探讨了交互式用户身份验证,使用的是OIDC协议. 在之前篇中对API访问使用的是OAuth2.0协议.这篇把这两个部分放在一起,OpenID Connect和OAuth 2.0组合 ...

  6. RazorPage 小测试,作下记录

    @page@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf@{}@functions{ public AppInfo item { ...

  7. 用wGenerator给编程提速

    1.需求设定 开发语言: java 数据库: mysql 持久化: mybatis 模式: mvc 视图引擎: thymeleaf 前端框架: bootstrap4 用以上的组合来开发一个公告管理的列 ...

  8. Java虚拟机二:使用jvisualvm工具远程监控tomcat内存

    jdk中自带了很多工具可以用于性能分析,位于jdk的bin目录下,jvisualvm工具可以以图形化的方式更加直观的监控本地以及远程的java进程的内存占用,线程状态等信息. 一.配置tomcat 在 ...

  9. vue学习笔记4

    父组件向子组件传值 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据 <script> // 创建 Vue 实例,得到 ViewModel var vm = ne ...

  10. 基于ArcGISServer进行分页矢量查询的方案进阶

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.    背景 在空间查询中,我们对查询结果要求以分页形式进行展示.G ...