C#中重写(override)及覆盖(new)的区别详解
1. 重写和覆盖的定义
1.1 重写(override)的定义
在C#中,用override关键字来重写一个父类中的虚方法或抽象方法。override关键字用于指示编译器,我要用派生类中的一个方法,重写基类中的同名方法。通过重写基类中的方法,可以实现多态性。有关重写与虚方法和抽象方法的详细示例,可移步C#虚方法和抽象方法示例。
override关键字的语法如下:
public override returnType MethodName(ParameterList)
{
// 方法实现
}
其中,public表示访问修饰符;override表示重写虚方法或抽象方法;returnType表示方法的返回类型;MethodName表示方法名称;ParameterList表示方法的参数列表。
需要注意的是,重写方法的访问修饰符必须与被重写方法的访问修饰符相同或更为宽松。
1.2 覆盖(new)的定义
在C#中,用new关键字来覆盖一个父类中的成员方法或成员变量。new关键字用于指示编译器,派生类中的一个方法或变量将隐藏基类中的同名方法或变量,从而改变了继承体系中的原有布局关系。
new关键字的语法如下:
new returnType MemberName(ParameterList)
{
// 成员实现
}
其中,returnType表示成员的返回类型;MemberName表示成员的名称;ParameterList表示成员的参数列表。
2. 两者的区别及示例
下面是一个示例:
//父类
public class FatherClass
{
public virtual string GetName()
{
return "我是父类中的虚拟方法";
}
}
//子类1
public class SonClass1 : FatherClass
{
public override string GetName()
{
return "我是子类1中的重写方法";
}
}
//子类2
public class SonClass2 : FatherClass
{
public new string GetName()
{
return "我是子类2中的覆盖方法";
}
}
随后通过程序入口函数调用:
public class Program
{
public static void Main(string[] args)
{
FatherClass fatherClass = new FatherClass();
Console.Write("直接调用父类中的虚方法:");
Console.WriteLine(fatherClass.GetName());
SonClass1 s1 = new SonClass1();
Console.Write("直接调用子类1中的重写方法:");
Console.WriteLine(s1.GetName());
SonClass2 s2 = new SonClass2();
Console.Write("直接调用子类2中的覆盖方法:");
Console.WriteLine(s2.GetName());
FatherClass f1 = new SonClass1();
Console.Write("声明父类,调用子类1中的重写方法:");
Console.WriteLine(f1.GetName());
FatherClass f2 = new SonClass2();
Console.Write("声明父类,调用子类2中的覆盖方法:");
Console.WriteLine(f2.GetName());
}
}
运行程序,得到的结果如下:
直接调用父类中的虚方法:我是父类中的虚拟方法
直接调用子类1中的重写方法:我是子类1中的重写方法
直接调用子类2中的覆盖方法:我是子类2中的覆盖方法
声明父类,调用子类1中的重写方法:我是子类1中的重写方法
声明父类,调用子类2中的覆盖方法:我是父类中的虚拟方法
总结:
1:不管是重写还是覆盖都不会影响父类自身的功能。
2:当用子类创建父类的时候,如 FatherClass f1 = new SonClass1(),重写会改变父类的功能,即调用子类的功能;而覆盖不会,仍然调用父类功能。
3:虚方法、实方法都可以被覆盖(new),但是抽象方法,接口 不可以。
4:抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以。
5:重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。
小拓展:当使用new关键字覆盖一个成员方法或变量时,隐藏的成员在类层次结构中的位置会改变,它会在派生类中被重新定义,而不是从基类中继承。当基类对象引用派生类对象时,派生类中隐藏的成员不被基类引用所包含,因此它们无法访问。而在派生类中,新定义的成员将起作用,完全与基类中的同名成员无关。
C#中重写(override)及覆盖(new)的区别详解的更多相关文章
- Android中Intent传值与Bundle传值的区别详解
Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面 这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...
- linux中cat、more、less命令区别详解##less 最合适最好用,和vim一样好用
linux中cat.more.less命令区别详解 caoxinyiyi关注 0.0362018.07.02 15:46:17字数 641阅读 516 linux中命令cat.more.less均可用 ...
- linux中cat、more、less命令区别详解
众所周知linux中命令cat.more.less均可用来查看文件内容,主要区别有:cat是一次性显示整个文件的内容,还可以将多个文件连接起来显示,它常与重定向符号配合使用,适用于文件内容少的情况:m ...
- PHP中private、public、protected的区别详解
先简单粗俗的描述下:public 表示全局,类内部外部子类都可以访问:private表示私有的,只有本类内部可以使用:protected表示受保护的,只有本类或子类或父类中可以访问: 再啰嗦的解释下: ...
- Java中Object.equals和String.equals的区别详解
前言 Java中的堆和常量池的区别是什么呢?Object.equals与String.equals的区别呢?下面让我们通过一个小示例让你明白它- 1.基础知识 Java的存储空间:寄存器.栈.堆.静态 ...
- 关于Linux安装中NAT模式和桥接模式的区别详解
1.一般我们在创建一个Linux虚拟机时候,会面临三个网络配置选择: 桥接模式.nat模式.host-only模式(主机模式,这个模式用得少,就不介绍了) 2.NAT模式: 所谓nat模式,就是虚拟系 ...
- 关于Linux安装中NAT模式和桥接模式的区别详解(转载)
1.一般我们在创建一个Linux虚拟机时候,会面临三个网络配置选择: 桥接模式.nat模式.host-only模式(主机模式,这个模式用得少,就不介绍了) 2.NAT模式: 所谓nat模式,就是虚拟系 ...
- Java集合中List,Set以及Map等集合体系详解
转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...
- 对python3中pathlib库的Path类的使用详解
原文连接 https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...
- Python中第三方库Requests库的高级用法详解
Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...
随机推荐
- HDU 多校 2023 Round #6 题解
HDU 多校 2023 Round #6 题解 \(\text{By DaiRuiChen007}\) A. Count Problem Link 题目大意 求有多少个长度为 \(n\),字符集大小为 ...
- 网络安全—PKI公钥基础设施
文章目录 前提知识 散列函数 非对称加密 数字签名 PKI 受信任的人 RA注册 CA颁发 IKE数字签名认证(交换证书) 密钥管理 前提知识 散列函数 散列也可以叫哈希函数,MD5.SHA-1.SH ...
- 用 C 语言开发一门编程语言 — 抽象语法树
目录 文章目录 目录 前文列表 抽象语法树的结构 使用递归来遍历树结构 实现求值计算 抽象语法树与行为树 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器l> <用 C 语 ...
- Java面试题:Spring中的循环依赖,给程序员带来的心理阴影
循环依赖通常发生在两个或多个Spring Bean之间,它们通过构造器.字段(使用@Autowired)或setter方法相互依赖,从而形成一个闭环.下面是一个使用字段注入(即使用@Autowired ...
- kubelet gc 源码分析
代码 kubernetes 1.26.15 问题 混部机子批量节点NotReady(十几个,丫的重大故障),报错为: 意思就是 rpc 超了,节点下有太多 PodSandBox,crictl ps - ...
- 【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标
最近YOLO家族又添新成员:YOLOv10,YOLOv10 提出了一种一致的双任务方法,用于无nms训练的YOLOs,它同时带来了具有竞争力的性能和较低的推理延迟.此外,还介绍了整体效率-精度驱动 ...
- 安装、学习protobuf
Protobuf是什么? 类似于json的一种数据格式,独立于语言,而且是二进制方式,所以比json更快,而且还可以直接存储一些图.树 序列化和反序列化 持久化(存到磁盘硬盘)领域中,数据存到磁盘叫序 ...
- MySQL学习笔记-数据查询语言
SQL-数据查询语言(DQL) DQL语法结构 #DQL语句编写顺序 select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 o ...
- Qt-udp通信
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=61 说明:UDP是面向无连接的,客户端并不与服务器不建立连接,直接向服务器发送数据, ...
- [经验分享] VPS安装爱快
前言:本人是作VPN服务端用,配合域名分流,蛮好用.参考1.送一个阿里云腾讯云安装爱快3.X的文档https://bbs.ikuai8.com/thread-97314-1-1.htmlVPS存在的问 ...