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

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. HTML标题

    HTML 标题 在 HTML 文档中,标题很重要. HTML 标题 标题(Heading)是通过 <h1> - <h6> 标签进行定义的. <h1> 定义最大的标题 ...

  2. #利用openCV裁脸

    #利用openCV裁脸import cv2 def draw_rects(img, rects): for x, y, w, h in rects: cv2.rectangle(img, (x, y) ...

  3. 改造MIP获得搜索青睐,轻松完成SEO

    搜索引擎目标及页面排序方法 搜索引擎作为互联网流量的入口,承担着流量分发的职责.但排序成千上万的网页,决定哪些网页在第一页,是由网页本身的用户体验决定的.权重算法会从内容优质性,广告多少,加载速度等多 ...

  4. 从壹开始微服务 [ DDD ] 之终篇 ║当事件溯源 遇上 粉丝活动

    回首 哈喽~大家好,时间过的真快,关于DDD领域驱动设计的讲解基本就差不多了,本来想着周四再开一篇,感觉没有太多的内容了,剩下的一个就是验证的问题,就和之前的JWT很类似,就不打开一个章节了,而且这个 ...

  5. 经典卷积神经网络结构——LeNet-5、AlexNet、VGG-16

    经典卷积神经网络的结构一般满足如下表达式: 输出层 -> (卷积层+ -> 池化层?)+  -> 全连接层+ 上述公式中,“+”表示一个或者多个,“?”表示一个或者零个,如“卷积层+ ...

  6. 死磕 java集合之PriorityBlockingQueue源码分析

    问题 (1)PriorityBlockingQueue的实现方式? (2)PriorityBlockingQueue是否需要扩容? (3)PriorityBlockingQueue是怎么控制并发安全的 ...

  7. 阿里云卸载自带的JDK,安装JDK完成相关配置

    0.预备工作 笔者的云服务器购买的是阿里云的轻量应用服务器,相比于云服务器ECS,轻量应用服务器是固定流量但是网络带宽较高,对于服务器来说,网络带宽是非常昂贵的,而带宽也决定了你的应用访问的流畅度,带 ...

  8. Caffe源码理解2:SyncedMemory CPU和GPU间的数据同步

    目录 写在前面 成员变量的含义及作用 构造与析构 内存同步管理 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 在Caffe源码理解1中介绍了Blob类,其中的数据成 ...

  9. spring源码 — 四、MVC

    spring mvc是怎么实现的?为什么我们只需要在方法上写一个注解,就可以通过http访问这个接口?下面我们分3部分来解答这两个问题 注意:本文是基于spring4.3.2的 spring mvc整 ...

  10. .Net 事件总线之Autofac解耦

    事件总线是通过一个中间服务,剥离了常规事件的发布与订阅(消费)强依赖关系的一种技术实现.事件总线的基础知识可参考圣杰的博客[事件总线知多少] 本片博客不再详细概述事件总线基础知识,核心点放置使用Aut ...