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

使⽤ Override 和 New 关键字进⾏版本控制(C#)

文章目录

  • 1. 基础概念
    • 1.1 override
    • 1.2 new
  • 2. 示例代码
    • 1. override 关键字
    • 2. new 关键字
  • 3.完整示例测试
    • 3.1 基类和派生类的定义
    • 3.2 测试代码
    • 3.3 运行结果
  • 结论


在 C# 中,override 和 new 关键字用于控制类之间的成员方法的隐藏和重写。理解它们之间的差异和使用场景对于设计灵活且易于维护的代码至关重要。在这篇博客中,我们将详细探讨这两个关键字的用法,并通过示例来说明它们的实际应用。

1. 基础概念

1.1 override

override 关键字用于重写基类中已经声明为 virtual 或 abstract 的方法、属性或索引器。使用 override 关键字可以提供基类方法的新实现。它的主要特点包括:

  • 多态性:通过重写方法,派生类可以实现特定的行为。
  • 基类引用:即使是基类引用,调用重写的方法也会执行派生类的实现。

1.2 new

new 关键字用于隐藏基类中的成员(方法、属性或事件)。当使用 new 关键字时,派生类中的成员将隐藏基类中的同名成员。它的特点包括:

  • 不支持多态性:基类引用仍会调用基类的方法,而不是派生类的方法。
  • 名称隐藏:派生类中的成员遮蔽了基类中的同名成员,但两者仍然存在于不同的作用域中。

2. 示例代码

1. override 关键字

override 关键字用于子类中覆盖(重写)父类中的方法。这样做可以让子类提供特定的实现,以满足其对方法的个性需求。

示例 1:使用 override 覆盖父类方法

using System;class Animal
{public virtual void MakeSound(){Console.WriteLine("Animal makes a sound");}
}class Dog : Animal
{public override void MakeSound(){Console.WriteLine("Dog barks");}
}class Program
{static void Main(string[] args){Animal myAnimal = new Animal();Animal myDog = new Dog();myAnimal.MakeSound();  // 输出:Animal makes a soundmyDog.MakeSound();     // 输出:Dog barks}
}

在这个例子中,Dog 类继承自 Animal 类,并覆盖了 MakeSound 方法。当 myDog.MakeSound() 被调用时,它将输出 “Dog barks”,而不是 “Animal makes a sound”。

2. new 关键字

new 关键字在C#中有两个主要用途:

它用于隐藏继承自基类的成员(方法、属性、事件等)。
它用于在接口中提供实现。
示例 2:使用 new 隐藏继承的方法

using System;class Animal
{public virtual void MakeSound(){Console.WriteLine("Animal makes a sound");}
}class Dog : Animal
{new public void MakeSound(){Console.WriteLine("Dog barks");}
}class Program
{static void Main(string[] args){Animal myAnimal = new Animal();Animal myDog = new Dog();myAnimal.MakeSound();  // 输出:Animal makes a soundmyDog.MakeSound();     // 输出:Dog barks}
}

在这个例子中,尽管 Dog 类覆盖了 MakeSound 方法,但是由于 new 关键字的使用,基类 Animal 的 MakeSound 方法不会被隐藏。

示例 3:使用 new 在接口中提供实现

using System;interface IMyInterface
{void MyMethod();
}class MyClass : IMyInterface
{public void MyMethod(){Console.WriteLine("Interface method implementation");}
}class Program
{static void Main(string[] args){IMyInterface myClass = new MyClass();myClass.MyMethod();  // 输出:Interface method implementation}
}

在这个例子中,MyClass 类实现了 IMyInterface 接口,并使用了 new 来提供 MyMethod 的具体实现。

3.完整示例测试

3.1 基类和派生类的定义

using System;public class Animal
{// 一个虚方法,可以在派生类中被重写public virtual void Speak(){Console.WriteLine("Animal speaks");}// 一个普通方法,可以在派生类中被隐藏public void Sleep(){Console.WriteLine("Animal sleeps");}
}public class Dog : Animal
{// 重写基类的虚方法public override void Speak(){Console.WriteLine("Dog barks");}// 使用 new 关键字隐藏基类的同名方法public new void Sleep(){Console.WriteLine("Dog sleeps");}
}

3.2 测试代码

接下来,我们可以编写一个测试程序,来演示 override 和 new 的行为。

class Program
{static void Main(string[] args){Animal myAnimal = new Animal();myAnimal.Speak();  // 输出: Animal speaksmyAnimal.Sleep();  // 输出: Animal sleepsAnimal myDog = new Dog();myDog.Speak();     // 输出: Dog barks (多态性)myDog.Sleep();     // 输出: Animal sleeps (基类方法)Dog realDog = new Dog();realDog.Speak();   // 输出: Dog barksrealDog.Sleep();   // 输出: Dog sleeps (新定义的方法)Console.ReadLine();}
}

3.3 运行结果

运行上述程序,输出结果如下:

Animal speaks
Animal sleeps
Dog barks
Animal sleeps
Dog barks
Dog sleeps

分析

  • 多态性:在示例中,myDog 是 Animal 类型的引用,但它指向一个 Dog 对象。调用 Speak 方法时,输出是 Dog barks,这就是多态性的体现。myDog.Sleep() 调用的是基类的 Sleep 方法,输出 Animal sleeps,因为 Sleep 方法没有被标记为 virtual。

  • 隐藏行为:realDog.Sleep() 调用的是 Dog 类中定义的新 Sleep 方法,输出 Dog sleeps。这表明使用 new 关键字隐藏了基类中的同名方法。

结论

override 和 new 是C#中用于版本控制和多态的两个关键字。使用 override,我们可以为子类提供特定的方法实现,而 new 则用于在继承体系中隐藏基类的成员或为接口提供实现。这两个关键字极大地增强了C#语言的灵活性和表达力。

相关文章:

使⽤ Override 和 New 关键字进⾏版本控制(C#)

文章目录 1. 基础概念1.1 override1.2 new 2. 示例代码1. override 关键字2. new 关键字 3.完整示例测试3.1 基类和派生类的定义3.2 测试代码3.3 运行结果 结论 在 C# 中,override 和 new 关键字用于控制类之间的成员方法的隐藏和重写。理解它们之间的差异和使用场景…...

JavaScript 15章:模块化编程

在现代软件开发中,模块化编程是一种非常重要的实践,它可以帮助开发者组织代码,提高代码的复用性和可维护性。以下是关于模块化编程的一些关键知识点和实战案例: 第15章:模块化编程 模块的概念 模块是指将一组相关的…...

qt creator 开发环境的安装

1.找官网 官网地址:Installation | Qt Creator Documentation 点 Parent Directory 继续点 Parent Directory 点 archive/ 2.下载在线安装器 点 online_ainstallers 选择在线安装器版本 选择对应版本后进入下载列表,根据自己的系统选择下载。 下载后…...

Xilinx远程固件升级(二)——STARTUPE2原语的使用

通过(一)可以看出,对于远程固件升级实际上是通过调用flash不同区域的bit实现,通过golden image和update image共同保障了系统的稳定性。在项目中如果将flash的时钟直接绑定FPGA后进行约束,在综合编译时是无法通过的。这…...

DynamicExpresso

DynamicExpresso 动态Expression 安装包:DynamicExpresso.Core Student.cs public class Student { public int Age { get; set; } public string Name { get; set; } public void Hello() { Con…...

从Naive RAG到Agentic RAG:基于Milvus构建Agentic RAG

检索增强生成(Retrieval-Augmented Generation, RAG)作为应用大模型落地的方案之一,通过让 LLM 获取上下文最新数据来解决 LLM 的局限性。典型的应用案例是基于公司特定的文档和知识库开发的聊天机器人,为公司内部人员快速检索内部…...

Linux 环境chrony设置服务器间时间同步一致

服务器: master01: slave02: slave03: 安装chrony安装: yum -y install chrony 设置以master01为时间服务器,其他服务器同步master01时间 master01的chrony.conf配置: server ntp1.aliyun.com iburst allow all local stratum 10重启ch…...

MetaCTO确认将放弃QuestPro2及轻量化头显正在开发中

MetaCTO确认将放弃QuestPro2及轻量化头显正在开发中 随着虚拟现实(VR)和增强现实(AR)技术的不断发展,越来越多的公司开始关注这个领域。其中,QuestPro2是一款备受关注的头戴式显示器,由MetaCTO公司开发。然而,最近MetaCTO公司宣布…...

深度学习 .exp()

在 MXNet 中,.exp() 是 ndarray 对象的方法,用于计算数组中每个元素的指数(e 的幂)。此方法适用于所有类型的 ndarray,并返回一个新的数组,其中每个元素都是相应输入元素的指数。 语法 ndarray.exp() 参…...

从数据管理到功能优化:Vue+TS 项目实用技巧分享

引言 在项目开发过程中,优化用户界面和完善数据处理逻辑是提升用户体验的重要环节。本篇文章将带你一步步实现从修改项目图标、添加数据、优化日期显示,到新增自定义字段、调整按钮样式以及自定义按钮跳转等功能。这些操作不仅提升了项目的可视化效果&am…...

SSD |(六)FTL详解(上)

文章目录 📚FTL综述📚映射管理🐇映射的种类🐇映射的基本原理🐇HMB🐇映射表写入 📚FTL综述 当SSD所使用的主控和闪存确定后,FTL算法的好坏将直接决定SSD在性能、可靠性、耐用性等方面…...

程序报错:ModuleNotFoundError: No module named ‘code.utils‘; ‘code‘ is not a package

程序报错内容&#xff1a; Traceback (most recent call last): File "code/nli_inference/veracity_prediction.py", line 10, in <module> from code.utils.data_loader import read_json ModuleNotFoundError: No module named code.utils; code is …...

【closerAI ComfyUI】电商模特一键换装解决方案来了!细节到位无瑕疵!再加上flux模型加持,这个工作流不服不行!

不得了了兄弟们。这应该是电商界的福音&#xff0c;电商模特一键换装解决方案来了&#xff01;细节到位无瑕疵&#xff01;再加上flux模型加持&#xff0c;这个工作流不服不行&#xff01; 这期我们主要讨论如何使用stable diffusion comfyUI 制作完美无瑕疵的换装工作流。** …...

【优选算法篇】编织算法的流动诗篇:滑动窗口的轻盈之美

文章目录 C 滑动窗口详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;热身练习1.1 长度最小的子数组解法一&#xff08;暴力求解&#xff09;解法二&#xff08;滑动窗口&#xff09;滑动窗口的核心思想图解分析滑动窗口的有效性时间复杂度分析易错点提示 1.2 无重复…...

Linux 常用打包和压缩格式命令(tar tar.gz tar.bz2 tar.xz zip)

Linux 常用打包和压缩格式命令&#xff08;tar tar.gz tar.bz2 tar.xz zip&#xff09; 常用压缩包&#xff1a; tar 仅打包&#xff0c;不压缩。 gzip 使用DEFLATE算法进行压缩,通常用于.gz或.tar.gz文件。 bzip2 使用Burrows-Wheeler算法进行压缩,通常用于.bz2或.tar.bz2文件…...

Scala入门基础(12)抽象类

抽象类&#xff0c;制定标准&#xff0c;不要求去具体实现 包含了抽象方法的类就是抽象类。抽象方法只是有方法名&#xff0c;没有具体方法体的方法 定义抽象类要用abstract&#xff08;抽象&#xff09;关键字 用智能驾驶技术举例&#xff1a;演示&#xff09…...

unity静态批处理

unity静态批处理 静态批处理要求和兼容性渲染管线兼容性 使用静态批处理在构建时进行静态批处理在构建时执行静态批处理的步骤&#xff1a; 在运行时进行静态批处理性能影响 静态批处理 静态批处理是一种绘制调用批处理方法&#xff0c;它将不移动的网格组合在一起&#xff0c…...

python项目实战——下载美女图片

python项目实战——下载美女图片 文章目录 python项目实战——下载美女图片完整代码思路整理实现过程使用xpath语法找图片的链接检查链接是否正确下载图片创建文件夹获取一组图片的链接获取页数 获取目录页的链接 完善代码注意事项 完整代码 import requests import re import…...

git分布式版本控制系统命令介绍、功能作用案例、子模块等知识点总结

Git是一个分布式版本控制系统&#xff0c;广泛用于软件开发中。以下是Git的常用命令、功能、作用以及一些使用案例的详细介绍。 Git 基本命令 配置 git config: 配置用户信息&#xff0c;如用户名和电子邮件。 git config --global user.name "Your Name"git confi…...

第八课:Python学习之循环

循环 目标 程序的三大流程while 循环基本使用break 和 continuewhile 循环嵌套 01. 程序的三大流程 在程序开发中&#xff0c;一共有三种流程方式&#xff1a; 顺序 —— 从上向下&#xff0c;顺序执行代码分支 —— 根据条件判断&#xff0c;决定执行代码的 分支循环 —— …...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...