C#方法重载(overload)方法重写(override)隐藏(new)
一、重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。
值得注意的是,方法重载只有通过参数不同来判断调用哪个方法,而不能通过返回值。至于原因,可以这样理解,你调用一个方法,如果有多个方法同名,系统必须要知道到底你要调用哪一个,参数可以帮助系统在方法入口处得到答案,他根据你给的参数就知道该使用哪个方法。如果只有返回值的不同,很多情况系统是不可能得到有效的判断条件的,比如:double method();int method();如果你这样调用:method()。系统当然不知道该调用哪个。
示例:
//返回值相同,参数不同
class BillPayment{void PayBill(int TelephoneNumber){//此方法用于支付固定电话费}void PayBill(long CustomerNumber){//此方法用于支付电费}void PayBill(long CustomerNumber,double amount){//次方法用于支付移动电话费}}
}
//返回值相同,参数个数不同
class Add
{int addtion(int num1,int num2){return num1+num2;}int addtion(int num1,int num2,int num3){returnnum1+num2+num3;}
}
//参数不同,返回值不同
int Method(int[] numbers)
{
}
double Method(double[] numbers)
{
}
注:泛型出现后,相同参数,相同返回值的方法也能构成重载,这里不介绍。
二、重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的,即方法名,参数,返回值都相同。
例如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.
重写override一般用于接口实现和继承类的方法改写,要注意:
1、覆盖的方法的标志必须要和被覆盖的方法的名字和参数完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
示例:
namespace 方法重写
{class Program{static voidMain(string[] args){BaseClass CO =new ClassOverride();CO.SetName("Override");}
//基类public classBaseClass{public virtualvoid SetName(string name){Console.WriteLine("基类:我的名字是" + name);}}//派生类public classClassOverride : BaseClass{publicoverride void SetName(string name){Console.WriteLine("Override:我的名字是" + name);}}}
}
在方法重写中,我们介绍了虚方法,那么虚方法和抽象方法有什么区别呢?
1.虚方法有一个实现部分可以被子类继承,从而使子类获得和基类相同的方法,另外也为派生类提供了覆盖该方法的选项。相反,抽象方法没有提供实现部分,是一种强制派生类覆盖的方法(否则派生类不能成具体类)
2.(abstract)抽象方法只能在抽象类中声明,(virtual)虚方法不是。
3.(abstract)抽象方法必须在派生类中重写而(virtual)虚方法不必。
4.(abstract)抽象方法不能声明方法实体,虚方法可以。
个人感觉,方法重载和方法重写都有点像多态,同一个方法的多种形态:执行“相同”的方法,却通过它们自己的实现代码来实现,即同一种方法,不同的对象会产生不同的结果。
三、隐藏(方法):基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。隐藏时,访问父类则调用父类的方法,访问子类则调用子类的方法。
示例:
namespace 隐藏
{class Program{static voidMain(string[] args){ClassNew CN =new ClassNew();CN.SetName("new");BaseClass BC =CN;BC.SetName("基类");}//基类public classBaseClass{public voidSetName(string name){Console.WriteLine("基类:我的名字是" + name);}}
//派生类public classClassNew : BaseClass{//这里如果不使用new,将生成警告!new publicvoid SetName(string name){Console.WriteLine("new:我的名字是" + name);}}}
}
运行结果:new:我的名字是new
基类:我的名字是基类
如果上述扔不好理解,我们再举一个隐藏静态变量的例子
namespace 隐藏继承成员
{class Program{public classBaseClass{public static int A = 123;}public classClassNew : BaseClass{new public static int A = 456;static voidMain(string[] args){Console.WriteLine(A);}}}
}
运行结果:456
注:不仅有方法隐藏,还有其他的,通过继承隐藏名称一般采用下列形式之一:
1.引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。
2.引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。
3.引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。
4.在同一成员上同时使用 new 和 override 是错误的。
另外,在不隐藏继承成员的声明中使用 new 修饰符将生成警告。在隐藏继承成员的生命中不使用new修饰符也将产生警告
转载于:https://www.cnblogs.com/javaspring/archive/2011/09/15/2656609.html
C#方法重载(overload)方法重写(override)隐藏(new)相关推荐
- 重载Overload 和重写Override区别
重载Overload 和重写Override区别 一.含义 二.代码 1.重载OverLoad 2.重写Override 一.含义 重载OverLoad:表示同一个类中的可以有多个方法名称相同的方法, ...
- c语言 方法重载 冲定义,C++ 重载(overload)、重写(overrride)、重定义(redefine)
今天参加了一个面试,问到了上面的C++知识点,都知道,时间久了难免遗忘,感觉回答的一般,不够专业,部分点还答错了,sigh!在此再补漏下. 注意:这些都是C++语言的特性,C语言连最简单的重载(ove ...
- C++多态及重载(overload),覆盖(override),隐藏(hide)的区别
转自 Hackbuteer1 http://blog.csdn.net/hackbuteer1/article/details/7475622 C++编程语言是一款应用广泛,支持多种程序设计的计算机编 ...
- 【C++专题】重载(overload)、覆盖(override)、隐藏(hide) 辨析
写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...
- C++ 重载(overload)、重写(overrride)、重定义(redefine)总结
昨晚打开论坛,看到有朋友问了一个关于虚函数的问题,因为头太疼了,所以今天中午起床再看. 问题传送门:http://www.cppleyuan.com/viewthread.php?tid=7923 C ...
- 方法重载,new,override
方法重载:参数列表不一样,方法名字一样,包括泛型,和返回值无关 new: 复写,方法重载 overload 继承是对于普通方法和属性 复写 父类的 override:覆盖,重写 , 对于抽象 ...
- 【JVM系列3】方法重载和方法重写原理分析,看完这篇终于彻底搞懂了
深入分析Java虚拟机中方法执行流程及方法重载和方法重写原理 前言 思考 栈帧 局部变量表(Local Variables) 操作数栈(Operand Stacks) 动态连接(Dynamic Lin ...
- 方法重载和方法重写的区别和作用
一.方法重载(Overload) 背景: 有时我们要用到一个函数同时兼容多种类型或者参数的情况,这时我们就要用到方法重载. 含义: 一个方法的逻辑是一样的,但是考虑到要适用不同的场景(参数个数不同,参 ...
- JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)
运行第一个JAVA程序: 这里使用的开发环境是eclipse,新建一个java工程,然后可以看到src这个是存放java代码的地方,然后在src文件右击新建一个class(类),然后可以看到下图,同样 ...
- Java中方法重载和方法重写的区别
文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...
最新文章
- 洛阳综合保税区正式获国务院批复同意设立
- C#开发教程初级-第一天-hello Word 控制台编程
- python的文件基本操作和文件指针
- 解决: Client does not support authentication protocol requested by server; consider upgrading MySQL
- 机器学习的重新思考:人工智能如何学习“失忆”?
- python-文件操作(1)
- IBM MQ 创建以及常见问题
- 批量关停azure vm_如何在Azure中使用Visual Studio和VM数据库
- 机器视觉光源之LED光源
- 克隆硬盘后进不去系统_Windows 10克隆后ssd硬盘不能引导启动
- JAVA缴税_根据工资和税率计算应缴税(java)
- PTA 7-55 剿灭魔教 (30分)(拓扑排序bfs版)
- 淮安万达机器人_淮安万博机器人 万达上班时间【输入网址YB7888.vip】angmi_PP视频搜索-PP视频-原PPTV聚力视频...
- H5 canvas 画圆 画圆角
- 【XMind学习笔记02】 你不得不知的5大功能
- 什么是HashMap?
- 图像处理——人脸黑头检测+用户界面
- 如果恢复计算机系统时间吗,一般的计算机还原系统需要多长时间?
- 正负用c语言表示,用C表示负数?
- VL综述:视觉-语言智能:任务、表征学习、大模型
热门文章
- android优化最强软件,最强大的安卓优化工具诞生,让手机流畅度提升75%
- linux课程_linux系统使用课程更新提示
- java学习笔记2022.1.15
- 搜索二维矩阵 II—leetcode240
- 迅雷启动不了,提示Atl71.dll文件丢失
- C语言:函数中参数的传值与传地址
- 成绩管理单链表文件c语言,c语言学生信息管理完整.docx
- 排序算法——直接插入排序
- c++ 标准库中 cin.ignore()
- android怎么实现标题搜索,Android Toolbar上SearchView的实现