首页 > 编程语言 >C# new 和override重写的区别

C# new 和override重写的区别

时间:2023-06-05 17:55:47浏览次数:51  
标签:C# 子类 move Animal override new 方法 Bird

在 C# 中,函数前面加 override 和 new 都可以实现函数的重写(Overriding)。不过它们实现的方式不同,因此会有一些区别。

1.Override

在 C# 中,override 关键字主要用于重写父类中虚方法(Virtual Method),它表示子类中的方法会覆盖父类中的同名方法。使用 override 关键字后,子类的方法必须与父类中被重写的方法具有完全相同的签名和返回类型,并且访问修饰符不能比父类中的方法更严格。

示例代码如下所示:

class Animal {
    public virtual void move() {
        Console.WriteLine("Animal is moving");
    }
}

class Bird : Animal {
    public override void move() {
        Console.WriteLine("Bird is flying");
    }
}

在上述代码中,Bird 类重写了 Animal 类中的 move() 方法。如果需要在子类中调用这个方法,可以直接使用子类的实例进行调用,例如:

Bird bird = new Bird();
bird.move(); // 输出 "Bird is flying"

2.New

new 关键字与 override 关键字也可以实现函数的重写,但是它们的实现方式不同。使用 new 关键字,定义的是一个新方法,它隐藏了从基类继承的同名方法。这就意味着,当基类中的同名方法被调用时,将调用基类中的方法,而不是子类中的方法。

示例代码如下所示:

class Animal {
    public virtual void move() {
        Console.WriteLine("Animal is moving");
    }
}

class Bird : Animal {
    public new void move() {
        Console.WriteLine("Bird is flying");
    }
}

在上述代码中,Bird 类使用 new 关键字定义了一个新方法 move(),它与 Animal 类中的 move() 方法具有相同的签名和返回类型。如果需要在子类中调用这个方法,需要使用子类的实例,并显式地调用子类中的方法,例如:

Bird bird = new Bird();
bird.move(); // 输出 "Bird is flying"

Animal animal = new Bird();
animal.move(); // 输出 "Animal is moving"

3.总结

可以看到,在使用子类实例调用 move() 方法时,使用的是子类中被隐藏的新方法,输出 "Bird is flying";而在使用父类实例调用 move() 方法时,会使用基类中的方法,输出 "Animal is moving"。

标签:C#,子类,move,Animal,override,new,方法,Bird
From: https://www.cnblogs.com/dreamos/p/17458567.html

相关文章

  • 前端实现导出word文档docx格式
    说明前端实现导出word文档,我们需要用到docxtemplater这个库使用的是vue2.6和vue-cli5还需要准备一个word模板,更多模板变量请去docxtemplater官网获取准备word模板安装需要用到的库//安装docxtemplaternpminstalldocxtemplaterpizzip--save//安装jszip-utilsn......
  • AH8669_交流AC220V降压转5V 300MA左右非隔离电源方案
    AH8669是一颗低成本的非隔离开关高性能交流转直流的转换器降压芯片,内部集成650V高耐压功率MOSFET额定700MA电流输出,非常适应于消费类的小家电控制模块以及给MCU供电和智能插座的家用电器上,交流转12V外围元件少,电路简单,内部集成软启动电路具有多功能保护有过载保护、过压保护、......
  • 嵌入式知识分享:Docker容器部署方法说明
    前 言本指导文档适用开发环境:Windows开发环境:Windows764bit、Windows1064bitLinux开发环境:Ubuntu18.04.464bit虚拟机:VMware15.1.0Docker是一个开源的应用容器引擎,让开发者可打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,亦......
  • 【解决方法】网络设备使用CLI命令行模式进入SSH登录,如交换机,路由器
    环境:工具:锐捷EVE模拟器,VMwareWorkstationPro远程工具:SecureCRT系统版本:Windows10问题描述:描述:在实验使用路由器远程SSH登录交换机时,无法连接,一直提示:%Unrecognizedhostoraddress,orprotocolnotrunning.提示:若按照教程还是无法完成操作,可以进入右侧的企鹅,......
  • ssh与scp
        function_ssh(){localuser=$1localip=$2localcmd=$3localquoted_cmdif["$user"!=root];thenquoted_cmd=$(quote"$cmd")cmd="sudo-sk<......
  • 如何获取 C#程序 内核态线程栈
    一:背景1.讲故事在这么多的案例分析中,往往会发现一些案例是卡死在线程的内核态栈上,但拿过来的dump都是用户态模式下,所以无法看到内核态栈,这就比较麻烦,需要让朋友通过其他方式生成一个蓝屏的dump,这里我们简单汇总下。二:如何生成内核态dump1.案例代码为了方便演示,来一段简单的......
  • 0005.有监督学习之逻辑回归(Logistic回归)
    一、逻辑回归概述分类计数是机器学习和数据挖掘应用中的重要组成部分。在数据科学中,大约70%的问题属于分类问题。解决分类问题也有很多种,比如:k-近邻算法,使用距离计算来实现分类;决策树,通过构建直观易懂的树来实现分类;朴素贝叶斯,使用概率论构建分类器。这里要讲的是Logistic回归,它......
  • C、C++、Java等控制汽车- 汽车引擎控制系统
    汽车代码的实现 - 汽车引擎控制系统汽车引擎控制系统是汽车代码中最重要的一部分之一。控制系统的目的是确保引擎在各种负载下运行顺畅,并最大程度地减少排放。控制系统的主要组成部分是ECU(电子控制单元),它是一种具有微处理器的电子设备,可接收传感器信号并控制汽车的各种功能,从燃......
  • ExecutorService 的理解和使用
    前言:我们之前使用线程的时候都是使用newThread来进行线程的创建,但是这样会有一些问题。如:a.每次newThread新建对象性能差。b.线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。c.缺乏更多功能,如定时执行、定期执行、线程中断。相比new......
  • 汽车代码的实现 - 用python、c++写的自动驾驶系统
    汽车代码的实现-自动驾驶系统自动驾驶系统是近年来发展迅速的汽车代码领域之一。这个系统旨在使用传感器和计算机,自动化控制车辆行驶,消除驾驶员的错误和危险。实现自动驾驶系统需要使用一些重要的编程语言和技术,如Python、Matlab、深度学习和机器视觉算法。此外,还需要使用各种......