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.mzph.cn/news/143875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive使用max case when over partition by 实现单个窗口取两个窗口的值(单个开窗函数,实际取两个窗口)

一、Hive开窗函数根据特定条件取上一条最接近时间的数据(单个开窗函数,实际取两个窗口) 针对于就诊业务,一次就诊,多个处方,处方结算时间可能不一致,然后会有多个AI助手推荐用药,会…

SpringCloud微服务:Ribbon负载均衡

目录 负载均衡策略: 负载均衡的两种方式: 饥饿加载 1. Ribbon负载均衡规则 规则接口是IRule 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询 2.负载均衡自定义方式 代码方式:配置灵活,但修…

自定义控件封装

上边对两个控件整合时用函数指针是因为QSpinBox::valueChange有重载版本 自定义的接口放在类外 你设计的界面可以通过提升为调用这些接口 添加qt设计师界面类

Elasticsearch的配置学习笔记

文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器。它提供一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,Elasticsearch是用Java语言开发的。 关于Elasticsearch系列笔记,主要从Elasticsearch的配置、核心组件、架构设计、使…

第十九章绘图

Java绘图类 Graphics 类 Grapics 类是所有图形上下文的抽象基类,它允许应用程序在组件以及闭屏图像上进行绘制。Graphics 类封装了Java 支持的基本绘图操作所需的状态信息,主要包括颜色、字体、画笔、文本、图像等。 Graphics 类提供了绘图常用的…

linux rsyslog日志采集格式设定三

linux rsyslog日志采集格式设定三 1.创建日志接收模板 打开/etc/rsyslog.conf文件,在GLOBAL DIRECTIVES模块下任意位置添加以下内容 命令: vim /etc/rsyslog.conf 测试:rsyslog.conf文件结尾添加以下内容 $template ztj,"%fromhost-ip% %app-name% %syslogseveri…

软件开发之路——关于架构师的一些书籍

文章目录 📋前言🎯什么是架构师🔥文末送书《高并发架构实战:从需求分析到系统设计》《中台架构与实现:基于DDD和微服务》《架构师的自我修炼:技术、架构和未来》《分布式系统架构:架构策略与难题…

kubernetes--pod详解

目录 一、pod简介: 1. Pod基础概念: 2. Kubrenetes集群中Pod的两种使用方式: 3. pod资源中包含的容器: 4. pause容器的两个核心功能: 5. Kubernetes中使用pause容器概念的用意: 二、pod的分类&#xff1…

Node.js 安装配置

文章目录 安装检测Node是否可用 安装 首先我们需要从官网下载Node安装包:Node.Js中文网,下载后双击安装没有什么特殊的地方,安装路径默认是C盘,不想安装C盘的话可以选择一下其他的盘符。安装完成以后可以不用配置环境变量,Node安装已经自动给…

NextJS工程部署到阿里云linux Ecs

nextjs项目有多种部署方式,本文介绍最简单的一种方式,将源码上传到云服务器,编译后使用pm2后台运行nextjs工程。 检查node、npm是否安装 查看npm版本,如果版本较低先升级npm版本 npm -v卸载 yum remove nodejs npm -y安装新版…

神经网络常见评价指标AUROC(AUC-ROC)、AUPR(AUC-PR)

神经网络的性能可以通过多个评价指标进行衡量,具体选择哪些指标取决于任务的性质。以下是神经网络中常见的评价指标: 准确性(Accuracy): 准确性是最常见的分类任务评价指标,表示模型正确预测的样本数占总样…

Electron 控制屏幕亮度

CMD控制屏幕亮度 一开始用brightness,dev下可用,打包后执行报错,找了很多文章都没办法解决。后来想到执行CMD命令去设置( 如何在 Windows 中使用命令行调整屏幕亮度 )。测试打包后正常,无需管理员权限。 引入exec const { exec }…

面试:容器技术

目录 为什么需要 DevOpsDocker 是什么?Docker 与虚拟机有何不同?什么是 Docker 镜像?什么是 Docker 容器?Docker 容器有几种状态?解释一下 Dockerfile 的 ONBUILD 指令?什么是 Docker Swarm?如何…

【开源】基于Vue.js的快递管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快递区域模块2.4 快递货架模块2.5 快递档案模块 三、界面展示3.1 登录注册3.2 快递类型3.3 快递区域3.4 快递货架3.5 快递档案3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 …

P6入门:项目初始化11-项目详情之计算Calculations

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍

目录 一、SysTick定时器 1、SysTick寄存器介绍 (1)控制及状态寄存器 (2)重装载数值寄存器 (3)当前数值寄存器 2、SysTick寄存器配置函数 二、FreeRTOS中的SysTick定时器 1、SysTick配置函数及分析 …

打开Outlook报错修复

打开Outlook报错修复 故障现象 打开outlook提示,outlook.exe --系统错误 故障截图 故障原因 原因是软连接指向错误重建即可。 解决方案 下载并运行下面批处理解决 del /F /Q "C:\Program Files\Microsoft Office\root\Office16\AppvIsvStream64.dll"…

WPF提供了哪些不同类型的画刷

在WPF中,画刷(Brush)用于填充图形对象(如形状、控件的背景和前景)的颜色和样式。WPF提供了几种不同类型的画刷: SolidColorBrush:这是最简单的画刷,它提供了一个单一的、固定的颜色。…

Pytorch部分报错问题

一、存在问题 1.链接库报错 问题报错:undefined symbol: __nvJitLinkAddData_12_1, version libnvJitLink.so.12 2.GPU不能使用 问题报错:在torch安装后测试gpu是否可用 torch.cuda.is_available() false 返回false 问题分析: 可能是…

yolov8系列[六]-项目实战-yolov8模型部署android

yolov8系列[六]-项目实战-yolov8模型部署android [TOC](yolov8系列[六]-项目实战-yolov8模型部署android) 参考:YOLOV8部署AndroidStudio