当前位置: 首页 > news >正文

C# new 和 override 的区别

在C#中子类继承抽象类的时候,new 和override都可以用来修饰子类方法,但两者之间是有区别的。

相同点:

  1. 它们都是子类在覆写基类方法时,修饰子类同名方法用的,都是为了隐藏基类的同名方法
  2. 在实例化子类对象的时候,访问的都是子类的方法
  3. 都可以在方法体中通过base来访问基类的方法

不同点:

  1. override用于重写基类的virtual方法,必须要申明override关键字,而new可以省略
  2. override会覆盖掉基类的同名方法,除非是在子类方法中用base访问基类方法,除此以外,再也无法访问基类方法。而new还是可以用通过其它方法访问到基类方法

怎么选择new还是override?

  1. 我们通常认为,基类的virtual方法是不完善的,只提供了基础的的申明和实现,override的方法,通常才是完善和可用,一般不希望去调用基类的虚方法,所以当我们只是需要这样简单的约定的时候,就会采用override的方式来覆写
  2. 什么时候用new?当基类的方法已经很完善,并且有可能在某种情况下需要调用的时候,我们就用new,这个时候new只是作为一种隐藏基类的方法和对基类同名方法的进一步扩展,基类的方法同样是有意义并且可以被调用的

下面是代码示例:

using System;
namespace TestNamespace
{// 基类public abstract class BaseClass{public string DoSomething(){return "BaseClass.DoSomething()";}public virtual string DoSomething2(){return "BaseClass.DoSomething()2";}}// 子类public partial class ChildClass : BaseClass{public new string DoSomething(){return "ChildClass. DoSomething()";//return base.DoSomething();}public override string DoSomething2(){return "ChildClass. DoSomething()2";//return base.DoSomething2();} }
}

调用方法: 

/
ChildClass child = new ChildClass();
child.DoSomething(); // 调用子类同名方法DoSomething()
child.DoSomething2() // 调用子类同名方法DoSomething2()/
BaseClass child = new ChildClass();
child.DoSomething(); // 调用基类同名方法DoSomething()
child.DoSomething2() // 调用子类同名方法DoSomething2()

从上面的代码示例中可以发现,一旦基类的虚方法被override,我们就无法再访问基类的DoSomething()方法,除非是在子类方法中用base.DoSomething()去访问,但对于new修饰的子类同名方法,我们还是可以访问。

http://www.lryc.cn/news/231431.html

相关文章:

  • C++11『右值引用 ‖ 完美转发 ‖ 新增类功能 ‖ 可变参数模板』
  • 在Windows以命令行方式根据文件名称搜索文件
  • asp.net数字档案管理系统VS开发sqlserver数据库web结构c#编程web网页设计
  • 数据挖掘 决策树
  • “技能兴鲁”职业技能大赛-网络安全赛项-学生组初赛 WP
  • [Android]修改应用包名、名称、版本号、Icon以及环境判断和打包
  • 基于风驱动算法优化概率神经网络PNN的分类预测 - 附代码
  • 安全计算环境(设备和技术注解)
  • 【Hello Go】Go语言函数
  • docker小技能:容器IP和宿主机IP一致( Nacos服务注册ip为内网ip,导致Fegin无法根据服务名访问 )
  • Android笔记:震动实现
  • CSDN每日一题学习训练——Java版(二叉搜索树迭代器、二叉树中的最大路径和、按要求补齐数组)
  • WPF中有哪些布局方式和对齐方法
  • 【2012年数据结构真题】
  • k8s_base
  • 2023年亚太杯APMCM数学建模大赛数据分析题MySQL的使用
  • 自学SLAM(8)《第四讲:相机模型与非线性优化》作业
  • STL—next_permutation函数
  • Mysql 三种不使用索引的情况
  • Ladybug 全景相机, 360°球形成像,带来全方位的视觉体验
  • centos 6.10 安装swig 4.0.2
  • mask: rle, polygon
  • 【JMeter】JMeter压测过程中遇到Non HTTP response code错误解决方案
  • 【Kingbase FlySync】评估工具安装及使用
  • pandas教程:Data Aggregation 数据聚合
  • 开启创造力之门:掌握Vue中Slot插槽的使用技巧与灵感
  • 【算法练习Day48】回文子串最长回文子序列
  • ubuntu下C++调用matplotlibcpp进行画图(超详细)
  • 芯科科技推出新的8位MCU系列产品,扩展其强大的MCU平台
  • Flink CDC