【C#】——重载和重写、覆盖
2015-09-06 21:05
323 查看
这一段时间一直在看C#视频,在视频遇到很多陌生的概念,看起来很相似,有些东西很不分清,所以对这些相似的概念总结一下,帮助我们更好的学习。
何为重写?
重写(Override)指子类修改父类中某个函数的函数体,需要重写的父类中的函数必须是由virtual、abstract 或 override标注的,不能重写非虚方法或静态方法。
Override是在继承的时候,如果你写的函数与要继承的函数函数特征(函数特征包括函数名,参数的类型和个数)相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类的函数了,它被覆盖掉了。
用关键字virtual修饰的方法,叫虚方法。虚方法是多态的一种体现。相应的没有用virtual修饰的方法,叫实方法。可以在子类中用override声明同名的方法,这个叫“重写”。“重写”父类方法就是修改它的实现方式或者说在子类中对它进行重新编写。重写是重写基类的方法,把父类中的方法变成我们更需要的。重写会改变父类中的方法功能。
何为覆盖?
覆盖(new)指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。在子类中用new 关键字修饰,定义的与父类中同名的方法。覆盖不会改变父类方法的功能。
重写VS覆盖
1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改)。
2:当用子类创建父类的时候,如 A1 a3 = new A2(),重写会改变父类的功能,即调用子类的功能;而覆盖不会,仍然调用父类功能。
3:虚方法、实方法都可以被覆盖(new),抽象方法,接口不可以。
4:抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以。
5:重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。
重载
overload:重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,(注:返回值不能区别函数是否重载),重载没有关键字。返回值可能不同,可能相同。
【总结】
感觉这些概念性的东西,长的差不多,很是相似,而且感觉他们之间的关系有种剪不断理还乱。这三个概念光纸上谈兵还是没有多大价值的,还是需要我们不断的去实践,利用例子中发现不同,进而有更加深入的理解。不管怎么样,查找一些资料,还是能更加深入的了解一次。总结就是对知识的汇总,所以利用总结提升自己!
本人纯属菜鸟一只,文章之中有不对的地方,还请大家及时指出,不胜感激!
何为重写?
重写(Override)指子类修改父类中某个函数的函数体,需要重写的父类中的函数必须是由virtual、abstract 或 override标注的,不能重写非虚方法或静态方法。
Override是在继承的时候,如果你写的函数与要继承的函数函数特征(函数特征包括函数名,参数的类型和个数)相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类的函数了,它被覆盖掉了。
用关键字virtual修饰的方法,叫虚方法。虚方法是多态的一种体现。相应的没有用virtual修饰的方法,叫实方法。可以在子类中用override声明同名的方法,这个叫“重写”。“重写”父类方法就是修改它的实现方式或者说在子类中对它进行重新编写。重写是重写基类的方法,把父类中的方法变成我们更需要的。重写会改变父类中的方法功能。
<span style="font-family:KaiTi_GB2312;">namespace 重写 { class Program { static void Main(string[] args) { A1 a1 = new A1(); Console.WriteLine(a1.GetName()); //输出内容为“贾文静” A2 a2 = new A2(); Console.WriteLine(a2.GetName()); //输出内容为“jiawenjing” //该例子注意和下面的例子进行对比 A1 a3 = new A2(); Console.WriteLine(a3.GetName()); //输出内容为“jiawenjing” } } public class A1 { public virtual string GetName() { return "贾文静"; } } public class A2 : A1 { public override string GetName() { return "jiawenjing"; } } }</span>
何为覆盖?
覆盖(new)指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。在子类中用new 关键字修饰,定义的与父类中同名的方法。覆盖不会改变父类方法的功能。
<span style="font-family:KaiTi_GB2312;">namespace 覆盖 { class Program { static void Main(string[] args) { B1 b1 = new B1(); Console.WriteLine(b1.GetName()); //输出内容为“贾文静” B2 b2 = new B2(); Console.WriteLine(b2.GetName()); //输出内容为“jiawenjing” //下半部分内容与上半部分进行对比 B1 b3 = new B2(); Console.WriteLine(b3.GetName()); //输出内容为“贾文静” } } public class B1 { public string GetName() { return "贾文静"; } } public class B2 : B1 { public new string GetName() { return "jiawenjing"; } } }</span>
重写VS覆盖
1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改)。
2:当用子类创建父类的时候,如 A1 a3 = new A2(),重写会改变父类的功能,即调用子类的功能;而覆盖不会,仍然调用父类功能。
3:虚方法、实方法都可以被覆盖(new),抽象方法,接口不可以。
4:抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以。
5:重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。
重载
overload:重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,(注:返回值不能区别函数是否重载),重载没有关键字。返回值可能不同,可能相同。
<span style="font-family:KaiTi_GB2312;"> public void fun() { Console.WriteLine("贾文静"); } public void fun(int i) { Console.WriteLine("贾文静"); }</span>
【总结】
感觉这些概念性的东西,长的差不多,很是相似,而且感觉他们之间的关系有种剪不断理还乱。这三个概念光纸上谈兵还是没有多大价值的,还是需要我们不断的去实践,利用例子中发现不同,进而有更加深入的理解。不管怎么样,查找一些资料,还是能更加深入的了解一次。总结就是对知识的汇总,所以利用总结提升自己!
本人纯属菜鸟一只,文章之中有不对的地方,还请大家及时指出,不胜感激!
相关文章推荐
- C# 样品管理模块和订单模块设计
- 第三方登录插件.NET版XY.OAuth-CSharp
- 数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>
- C#生成不重复随机数的方法
- c#,EXCEL 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?解决办法
- C#设置IE代理
- [CLR via C#]值类型的装箱和拆箱
- c#进程间通信(Inter-Process Communication)
- C#综合揭秘——细说多线程(下)
- C#综合揭秘——细说多线程(上)
- Clr Via C#读书笔记---计算限制的异步操作
- bc#54 div2
- C#系统服务
- c#文件的读写
- C# 委托应用总结
- [CLR via C#]引用类型和值类型
- CLR via C# 3 文摘
- C# IList转List方法
- C#枚举 方法应用示例
- C#:路径