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使用起来让人实在感觉不好.它已经不适合现在的时代, ...
随机推荐
- GCC编译选项含义解析
GCC 编译 GCC的编译流程分为四个步骤,分别为: 预处理(Pre-Processing) 可以通过gcc -E hello.cc -o hello.i查看中间结果 编译(Compiling) 汇编 ...
- 让创意在幻觉中肆虐: 认识Illusion Diffusion AI
人工智能新境界 在不断发展的人工智能领域,一款非凡的新工具应运而生,它能将普通照片转化为绚丽的艺术品.敬请关注Illusion Diffusion,这是一个将现实与想象力完美融合的AI驱动平台,可创造 ...
- apisix~升级原始插件的方法
扩展apisix原始插件 当apisix提供的插件不能满足我们要求时,我们可能需要将它的plugin进行个性化扩展,例如一个jwt认证插件jwt-auth,它本身具有验证jwt有效性功能,支持rs25 ...
- aws语音呼叫调用,告警电话
import requests data = { 'channel': '99x', 'called_number': '135xxx', 'tts_code': 'TTS_xx', 'tts_par ...
- 鸿蒙HarmonyOS实战-Stage模型(开发卡片事件)
一.开发卡片事件 HarmonyOS元服务卡片页面(Metaservice Card Page)是指在HarmonyOS系统中,用于展示元服务的页面界面.元服务是指一组提供特定功能或服务的组件,例如天 ...
- 分享一个Byte KB MB GB 单位转换方法 从《C#本质论第三版》
static public string FormatBytes(long bytes) { string[] magnitudes = new string[] { "GB", ...
- 如何使用Charles查看页面接口请求?
1.Charles下载地址: https://www.charlesproxy.com/latest-release/download.do 2.如何抓取浏览器的操作 2.1 点击映射 2.2 点击映 ...
- 为什么wait()、notify()方法需要和synchronized一起使用
提示:更多优秀博文请移步博主的GitHub仓库:GitHub学习笔记.Gitee学习笔记 Obj.wait()与Obj.notify()必须要与synchronized(Obj)一起使用,也就是wai ...
- MKV与MatroskaExtractor
mkv封装格式相关内容可以参考:MKV 文件格式解析_Martyn哥的博客-CSDN博客_mkv 格式解析 本篇主要是用来记录MatroskaExtractor是如何解析EBML的,如何解析EBML ...
- [C#] 禁用控制台关闭按钮
禁用控制台关闭按钮 internal class Program { [DllImport("user32.dll", EntryPoint = "FindWindow& ...