C#中Override与New关键字的运用及实例解析

news2024/9/25 15:24:24

文章目录

    • override 关键字
    • new 关键字
    • 使用场景
    • 使用注意事项和最佳实践
    • 总结

在这里插入图片描述


在C#编程中,override 和 new 关键字用于处理类的继承和方法的重写。理解它们的用法和区别对于编写清晰和高效的面向对象代码至关重要。本文将详细阐述这两个关键字的含义、使用场景,并提供具体示例来帮助读者更好地理解它们在C#中的作用。

override 关键字

含义
override 关键字用于在派生类中重写基类中已经标记为 virtual 或 abstract 的方法、属性或索引器。通过使用 override,你可以提供一个具体的实现来替代基类的默认实现。这允许你在继承层次结构中定义不同的行为,同时保留方法签名的一致性。

使用场景
多态性:当你希望通过基类引用调用派生类中的方法时,使用 override 关键字。这是实现多态的基础。
基类成员标记:基类中的方法、属性或索引器必须被标记为 virtual 或 abstract 才能在派生类中使用 override。
示例

using System;

public class Animal
{
    // 基类中的虚方法
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal makes a sound.");
    }
}

public class Dog : Animal
{
    // 重写基类中的虚方法
    public override void MakeSound()
    {
        Console.WriteLine("Dog barks.");
    }
}

public class Program
{
    public static void Main()
    {
        Animal myDog = new Dog();
        myDog.MakeSound();  // 输出: Dog barks.
    }
}

解释
在上面的示例中:

  1. Animal 类中的 MakeSound 方法被标记为 virtual,允许在派生类中重写。
  2. Dog 类重写了 MakeSound 方法,提供了一个新的实现。
  3. 通过 Animal 类型的引用 myDog 调用 MakeSound 方法时,实际执行的是 Dog 类中的实现,这显示了多态的特性。

new 关键字

含义
new 关键字用于在派生类中隐藏基类中的成员(方法、属性或字段)。这不是对基类成员的重写,而是创建一个新的成员。这种隐藏关系不会影响基类的行为,且隐藏的成员不会参与多态性。

使用场景

隐藏基类成员:当你在派生类中需要一个新的实现,而不影响基类的实现时,使用 new 关键字。
不需要多态性:当你不打算通过基类引用访问派生类中的成员时,使用 new。
示例

using System;

public class Parent
{
    public void Show()
    {
        Console.WriteLine("Parent Show");
    }
}

public class Child : Parent
{
    // 使用 new 关键字隐藏基类中的方法
    public new void Show()
    {
        Console.WriteLine("Child Show");
    }
}

public class Program
{
    public static void Main()
    {
        Parent parent = new Parent();
        Parent childAsParent = new Child();
        Child child = new Child();

        parent.Show();             // 输出: Parent Show
        childAsParent.Show();     // 输出: Parent Show
        child.Show();             // 输出: Child Show
    }
}

解释
在上面的示例中:

  1. Parent 类中的 Show 方法在 Child 类中被隐藏。
  2. Child 类中的 Show 方法使用了 new 关键字,因此 Parent 类的 Show 方法仍然存在。
  3. 通过 Parent 类型的引用 childAsParent 调用 Show 方法时,调用的是 Parent 类中的实现,而不是 Child 类中的实现。这表明 new 关键字不会影响多态性。

使用注意事项和最佳实践

1. 选择 override 时:

  • 确保基类中的成员方法、属性或索引器被标记为 virtual 或 abstract。
  • 使用 override 实现多态性,允许通过基类引用调用派生类的实现。

2. 选择 new 时:

  • 了解 new 关键字隐藏了基类中的成员,不会参与多态性。
  • 使用 new 时,基类和派生类中的成员是两个不同的成员,调用哪个实现取决于引用的类型。

3. 避免混淆:

  • 在同一个类中使用 override 和 new 关键字可能会导致代码阅读困难。明确你需* 要的行为,以选择适当的关键字。

4. 检查警告:

  • 编译器会在使用 new 关键字隐藏基类成员时发出警告。审视这些警告并决定是否需要隐藏基类成员,避免潜在的错误。

总结

override 和 new 是 C# 中处理继承和多态性的关键字。使用 override 可以重写基类中的虚方法,实现多态性,使得运行时能够调用到派生类的实现。而使用 new 则隐藏基类中的成员,创建新的实现,这种隐藏不会影响基类的行为,也不参与多态性。理解这两个关键字的区别和适用场景对于编写健壮和可维护的代码至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995925.html

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

相关文章

5分钟带你走近:LVS负载均衡(lvs知识点+实验配置)

集群和分布式简介 1、系统性能扩展方式 Scale UP:向上扩展,增强 Scale Out:向外扩展,增加设备,调度分配问题,Cluster 2、集群Cluster Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统 Cluster常见…

PDF扫描?用lookscanned就好了【送源码】

日常工作,我们有时会需要把电子文档转换成看起来像是用扫描仪扫描出来的PDF文件,满足某些特定的需求,你懂的~~ 有时候身边没有打印机或者打印纸,或者打印不方便,总不至于每天都背着吧? 今天要跟大家聊聊一…

SX_错误声明定义了两个以上的数据类型BUG解决_14

具体报错: In file included from perfmon_priv.h:32,from perfmond.c:21: perfmon_api.h:7:18: 错误: 声明指定了两个以上的数据类型7 | #define uint8_t unsigned char perfmon_api.h:7:27: 错误: 声明指定了两个以上的数据类型7 | #define uint8_t unsigned cha…

《人工智能算力资源池技术规范》团体标准正式发布!

由趋动科技提出、中关村新兴科技服务业产业联盟牵头、联合行业专家单位参与,遵循标准制定流程,经过批准起草小组会议讨论、广泛征求意见、委员会草案投票等流程的《人工智能算力资源池技术规范》团体标准(标准编号为T/STSI 43—2023&#xff…

洛谷 P1433 吃奶酪

原题https://www.luogu.com.cn/problem/P1433 Description 房间里放着 n 块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 (0,0)点处。 Input 第一行有一个整数,表示奶酪的数量 n。 第 2 到第(n1) 行,每行…

短视频SDK,支持Flutter跨平台框架,加速产品上线进程

在数字内容爆炸式增长的今天,短视频已成为连接用户、传递情感、展现创意的重要桥梁。为助力开发者快速融入这股潮流,美摄科技匠心打造了一款专为Flutter框架优化的短视频SDK解决方案,旨在降低技术门槛,加速产品迭代,让…

商标直接注册初审通过提高的注意!

近日下了一批商标注册申请初步审定公告通知书,普推知产商标老杨发现其实许多商标名称申请在前,经过专业检索查重,基本上就知道通过率如何,虽然是一个预判,但是对于有经验的商标代理人员来说,预估七成基本判…

HTML - 简易版打字练习

1. 赛博朋克风格的视觉设计 颜色与渐变:通过linear-gradient设置了背景的颜色渐变,使用高饱和度的霓虹色彩(如橙色、绿色和蓝色)来营造赛博朋克的视觉效果。这种配色方案是赛博朋克风格的典型元素。 立体感和阴影:使用…

春秋云镜CVE-2023-38836

打开靶场环境 点击发现一个登陆框&#xff0c;弱口令试一下 发现账号密码为admin,password 随便点击点击 Media发现这里可以上传文件上传木马试试 <?php eval($_POST["wjq"]); ?> 发现不能上传php文件 php内容 修改他的格式 抓包绕过一下 302就可以其实已经…

绘制echarts-liquidfill水球图

文章目录 一、效果图二、步骤1.安装插件2.引入2.主要代码2.素材图片 总结 一、效果图 二、步骤 1.安装插件 npm install echarts npm install echarts-liquidfillecharts5的版本与echarts-liquidfill3兼容&#xff0c;echarts4的版本与echarts-liquidfill2兼容,安装的时候需要…

Spring I

1. IoC & DI ⼊⻔ 1.1 Spring 是什么&#xff1f; 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场 景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 但是这个概念相对来说, 还是⽐较抽象. 我们⽤⼀句更具体的…

C++中的搜索二叉树模拟实现代码

包含的功能&#xff1a;插入、删除、查找、中序遍历&#xff08;排列大小&#xff09; 代码&#xff1a;

Linux 内核源码分析---proc 文件系统

proc文件系统 进程数据文件系统&#xff08;process data filesystem, procfs&#xff09;装载在 /proc&#xff0c;缩写为 procFS。 proc 文件系统是一种虚拟文件系统&#xff0c;其信息不能从块设备读取。只有在读取文件内容时才动态生成相应的信息。使用proc文件系统&…

WPF篇(7)- Control基类+ContentControl类(内容控件)+ButtonBase基类

前面给大家介绍完了WPF所有的布局控件&#xff0c;属性以及使用案例&#xff0c;从这里咱们就开始学下内容控件。 Control基类 Control是许多控件的基类。比如最常见的按钮&#xff08;Button&#xff09;、单选(RadioButton)、复选&#xff08;CheckBox&#xff09;、文本框…

【JavaEE初阶】JUC(java.uitl.concurrent)的常见类

&#x1f334;Callable 接口 之前讲到Runnable接口&#xff0c;用于描述一个任务&#xff0c;通过Runnable中的run方法来体现的&#xff0c;但是描述的任务没有返回值&#xff08;run方法是返回void&#xff09;&#xff0c;此处的Callable接口与Runnable接口类似&#xff0c;C…

LLVM理论篇之编译器前端

1、简述 LLVM前端通过对源程序的预处理&#xff0c;构成源程序的字符流扫描与分解&#xff0c;将单词序列提取为各类语法短语&#xff0c;生成抽象语法树&#xff0c;最终转换为中间代码。编译器前端包含的这几个过程如下&#xff1a; &#xff08;1&#xff09;预编译 &…

【python】实现对文件夹中的图像连续重命名方法

import os import shutildef rename_images(input_folder):# 获取输入文件夹下的所有图片文件&#xff08;假设都是.jpg格式&#xff09;image_files [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f)) and f.endswith(".jpg"…

性能测试工具LoadRunner

前言&#x1f440;~ 上一章我们介绍了性能测试的一些基本概念&#xff0c;重要的是性能测试的各项指标&#xff0c;今天我们使用性能测试工具LoadRunner简单的完成一次性能测试 性能测试Load Runner LoadRunner是什么&#xff1f; LoadRunner安装 LoadRunner脚本录制 1.录…

振弦式钢筋计的主要应用领域有哪些?

在现代工程建设中&#xff0c;钢筋作为重要的结构材料&#xff0c;其应力状态直接关系到工程结构的安全性和稳定性。因此&#xff0c;对钢筋应力的实时监测成为了保障工程质量的关键环节。振弦式钢筋计作为一种高精度、稳定性好的应力监测仪器&#xff0c;在桥梁、建筑、隧道等…

pg一些常用语句记录

查看数据库大小 pg_size_pretty:将数据库用量展示为KB、MB、GB等样式,查看更直观查看具体某个数据库的大小 select pg_size_pretty(pg_database_size(postgres)); 查看所有数据库的大小 select pg_database.datname, pg_size_pretty (pg_database_size(pg_database.datnam…