剪不断理还乱--C#重载/重写/覆盖
在实际的编程中会有很多类、方法、函数等出现同名的情况,造成了程序的可读性差的问题。为了避免这种问题的出现,C#提供了很多机制来区别或修改同名的函数或方法,如:命名空间、类名、重载和覆盖等。这篇博客将会对重载和覆盖进行比较,并通过例子来强化记忆。
一、重载
1、重载示意
重载(Overload)是重新加载的意思,指的是同一个类中同名,但是参数列表不同的方法组(返回值不能区别函数是否重载),重载没有关键字。通俗点说重载是对内存中同一个类中的函数或方法进行重新加载的意思。
2、发生条件
必须发生在一个类中,函数名相同,参数类型或者顺序不同构成重载,与返回类型无关。
如:
Public class Name
{Public string GetName(string username){Return username;}
Public int GetName(int usercount){Return usercount;}
}
二、重写
1、示意
重写(Override)指子类修改父类中某个函数的函数体,需要重写的父类中的函数必须是由virtual、abstract 或 override标注的,不能重写非虚方法或静态方法。
Override是在继承的时候,如果你写的函数与要继承的函数函数特征(函数特征包括函数名,参数的类型和个数)相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类(或超类)的函数了,它被覆盖掉了。
2、发生条件
必须发生在基类和派生类中,基类函数必须用virtual、abstract 或 override修饰,派生类用override修饰。
如:
class Program{static void Main(string[] args){oc oa=new ob();oa.b(1, 2); //输出结果为fdfdf}public class oc{private int a;//封装public int geta{get { return a; }}public int seta{set { a = value; }}//函数bpublic virtual int b(int c, int e){Console.WriteLine("{0}+{1}={2}", c, e, c + e);return c + e;}}//派生类ob,基类ocpublic class ob : oc{//重写基类中的函数bpublic override int b(int c,int e){Console.WriteLine("fdfdf");return c;} }
}
三、覆盖
1、示意
覆盖指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。
2、发生条件
在子类中写一个和基类一样名字(参数不同也算)的非虚函数,会让基类中的函数被隐藏,编译后会提示要求使用New关键字。
如:
class Program{static void Main(string[] args){oc oa=new ob();oa.b(1, 2); //输出结果为1+2=3}public class oc{private int a;//封装public int geta{get { return a; }}public int seta{set { a = value; }}//函数bpublic int b(int c, int e){Console.WriteLine("{0}+{1}={2}", c, e, c + e);return c + e;}}//派生类ob,基类ocpublic class ob : oc{//覆盖,隐藏基类中的函数bpublic new int b(int c,int e){Console.WriteLine("fdfdf");return c;} }
}
四、总结
重写(Override)的两个函数的函数特征相同,应用在子类和父类中,会重写父类函数;重载(Overload)的两个函数的函数名虽然相同,但函数特征不同,应用在同一类中;覆盖(new)两个函数的函数名一定相同,但函数特征可相同也可不相同,应用在子类和父类中,会隐藏父类同名函数。
它们三者的在使用时还有很多需要注意的地方,在应用中慢慢积累吧,如果有不懂或不对的地方请留言互相交流哦。
剪不断理还乱--C#重载/重写/覆盖相关推荐
- java的重写、重载、覆盖的差别
多态性 通过继承,一个类能够用作多种类型:能够用作它自己的类型.不论什么基类型,或者在实现接口时用作不论什么接口类型.这称为多态性 重载 每一个类型成员都有一个唯一的签名.方法签名由方法名称和一个 ...
- 重载和覆盖的区别?(overload vs override)
override与overload的区别? override 表示重写,overload 表示重载. override是子类和父类之间的关系,是垂直关系:overload是同一个类中方法之间的关系,是 ...
- 《C++成员函数重载、覆盖与隐藏》
<成员函数的重载.覆盖与隐藏> ------------------------------------------------------------------------------ ...
- C++中的重载、覆盖、隐藏对比
1.重载.重写(覆盖).隐藏三者概念解释 重载(overload):同一个可访问区域内被声明的几个具有不同参数列(参数的类型.个数.顺序不同)的同名函数.根据参数列表,最终确定调用哪个函数,重载不关心 ...
- 谈谈C++继承中的重载,覆盖和隐藏
写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能 翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的 ...
- java重载_Java的重载与覆盖,傻傻分不清!
重载和覆盖是JAVA多态性的不同表现方式,其中重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,他们或有不同参数个数或有不同参数类型. 在使用重载时需注意以下几点: 1)重载是通过 ...
- php继承和重载区别,php继承中方法重载(覆盖)的应用场合
php继承中方法重载(覆盖)的应用场合 发布于 2015-02-23 17:57:23 | 91 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...
- Java的重载与覆盖,傻傻分不清!
重载和覆盖是JAVA多态性的不同表现方式,其中重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,他们或有不同参数个数或有不同参数类型. 在使用重载时需注意以下几点: 1)重载是通过 ...
- J2EE 重载跟覆盖的概念以及区别
方法的重载(overload)和覆盖(override) 有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数.例如我们最常用的System.out.println() ...
最新文章
- LED数码管仿真显示程序
- 小米redmi_99.9元!Redmi首款智能手环评测:能“打赢”小米手环5吗?
- C# NameValueCollection集合 (转)
- win7变成xp风格了怎么改回_微软看了会沉默,把 Windows 10 变成经典 98 风格
- 【Flink】FLink Barrier 在流经算子 做 checkpoint 的时候,数据是停止的吗?
- centos7的启动过程
- Python用format格式化字符串
- winform point数组带数值_excel 根据条件标注最大数值最小数值
- 编译telepresence:没有规则可制作目标“tinywrap/ActionConfig.cxx”,由“telepresence-ActionConfig.o” 需求。
- R语言---Ubuntu中R语言更新至R4.2.1和R包devtools下载
- 用计算机键盘如何截屏,键盘上哪个键是截图 电脑键盘截图快捷键用法
- alios是安卓吗_揭秘:阿里云OS和Android的主要区别是什么
- java模拟器怎么调中文_电脑java模拟器(javagame模拟器)
- ArtWork.Conversion.
- 不同系统下的shell的不同_不同地区不同气候条件下杉木成材时间的区别
- Grafana修改主题背景升级版
- c# AutoCAD 操作交互
- 基于扩展卡尔曼滤波(EKF)和低成本传感器的AHRS实现
- 熬之滴水穿石:一切从windows编程开始(3)
- 1MB有多少字节,1mb有多少个汉字,流量就这样被把握住