在实际的编程中会有很多类、方法、函数等出现同名的情况,造成了程序的可读性差的问题。为了避免这种问题的出现,C#提供了很多机制来区别或修改同名的函数或方法,如:命名空间、类名、重载和覆盖等。这篇博客将会对重载和覆盖进行比较,并通过例子来强化记忆。
一、重载
重载(Overload)是重新加载的意思,指的是同一个类中同名,但是参数列表不同的方法组(返回值不能区别函数是否重载),重载没有关键字。通俗点说重载是对内存中同一个类中的函数或方法进行重新加载的意思。
2、发生条件
必须发生在一个类中,函数名相同,参数类型或者顺序不同构成重载,与返回类型无关。
如:
Public class Name{ Public string GetName(string username) { Return username; }Public int GetName(int usercount) { Return usercount; }}
二、重写
重写(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; } } //函数b public virtual int b(int c, int e) { Console.WriteLine("{0}+{1}={2}", c, e, c + e); return c + e; } } //派生类ob,基类oc public class ob : oc { //重写基类中的函数b public 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; } } //函数b public int b(int c, int e) { Console.WriteLine("{0}+{1}={2}", c, e, c + e); return c + e; } } //派生类ob,基类oc public class ob : oc { //覆盖,隐藏基类中的函数b public new int b(int c,int e) { Console.WriteLine("fdfdf"); return c; } }}
重写(Override)的两个函数的函数特征相同,应用在子类和父类中,会重写父类函数;重载(Overload)的两个函数的函数名虽然相同,但函数特征不同,应用在同一类中;覆盖(new)两个函数的函数名一定相同,但函数特征可相同也可不相同,应用在子类和父类中,会隐藏父类同名函数。
它们三者的在使用时还有很多需要注意的地方,在应用中慢慢积累吧,如果有不懂或不对的地方请留言互相交流哦。
- 1楼zxlmsl前天 23:36
- 学习了