02-24 面向对象--方法重载、隐藏
在面向对象思想中,由于基本特性--继承所致,产生了子类继承父类的关系,所以出现重载方法。
由于子类对象同事“汇聚了”父类和子类的方法所有公共方法,而C#并未对子类和父类的方法名称过多的 加以限制,因此会出现一些问题。
如果子类中的某个方法与父类方法的签名一致(即方法名和方法参数一样),那当通过子类对象访问此方法时,访问的是子类方法还是父类方法?
这就需要先从子类方法和父类方法之间的关系说起,总的来说,子类方法和父类方法之间的关系可以概括为一下三种。
- 扩充:子类方法,父类没有;
- 重载:子类有父类的同名函数,但参数类型或数目不一样;
- 完全相同:子类方法和父类方法从方法名称到参数类型完全一样。
对于第一种"扩充"关系,由于子类与父类方法不同名,所以不存在同名方法调用的问题,重点分析后两种情况。
(1)重载
在上面已介绍过方法重载的概念,再同一个类中构成重载的方法主要根据参数列表来决定调用哪一个。这一基本判断方法可以推广到类的继承情况。
1 namespace _20141212jicheng 2 { 3 class Parent //父类 4 { 5 public void OverloadF() //父类的方法 6 { 7 } 8 } 9 class Child : Parent //子类继承父类 10 { 11 public void OverloadF(int i)//子类的方法(带参数的方法) 12 { 13 } 14 } 15 }
使用代码如下:
1 static void Main(string[] args) 2 { 3 4 Child obj = new Child(); 5 obj.OverloadF(); //调用父类的重载方法 6 obj.OverloadF(100); //调用子类的重载方法 7 8 }
可看出,虽然重载的方法分布在不同的类中,但仍然可以将其看成是定义在同一类中的,其使用方法与调用类的其他方法并无不同。
(2)隐藏
当子类与父类拥有完全一样的方法时,称“子类隐藏了父类的同名方法”,请看实例项目。
1 class Parent //父类 2 { 3 public void HideF() //父类的方法 4 { 5 System.Console.WriteLine("Parent.HideF()"); 6 } 7 } 8 class Child : Parent //子类继承父类 9 { 10 public void HideF()//子类的方法 11 { 12 System.Console.WriteLine("Child.HideF()"); 13 } 14 }
注意现在子类和父类都拥有了一个完全相同的方法HideF(),于是问题就产生了:
1 Child c = new Child(); 2 c.HideF();//调用父类的还是子类的同名方法?
上述代码运行时,输出:
修改以下代码:
1 Parent p = new Parent(); 2 p.HideF();//调用父类的还是子类的同名方法?
上述代码运行结果:
由此得出结论:
当分别位于父类和子类的两个方法完全相同时,调用哪个方法由对象变量的类型决定。
然而,面向对象的继承特性允许使用子类对象被当成父类对象使用,这就问题复杂化了,以下代码运行时,会出现什么结果?
1 Child c = new Child(); 2 Parent p; 3 p = c; 4 p.HideF();//调用父类的还是子类的同名方法?
上述代码运行结果:
这就意味着即使Parent变量P中世纪引用的是Child类型的对象,通过P调用的方法还是Parent类的;
如果确实希望调用的子类的方法,应该这样使用:
1 ((Child) p).HideF();
运行结果:
即先进行强制类型转换。
回到前面的Parent和Child类的定义,VS在编译这两个类时,会发出一个不符合C#语句规范的警告,修改之后:
1 class Child : Parent //子类继承父类 2 { 3 public new void HideF()//子类的方法 4 { 5 System.Console.WriteLine("Child.HideF()"); 6 } 7 }
“new”关键字明确告诉C#编译器,子类隐藏父类的同名方法,提供自己的新版本。
由于子类隐藏了父类的同名方法,所以如果要在子类方法的实现代码中调用父类被隐藏的同名方法,请使用base关键字,代码如下:
base.HideF();//调用父类被隐藏的方法
转载于:https://www.cnblogs.com/xiaoqingshe/p/4298537.html
02-24 面向对象--方法重载、隐藏相关推荐
- C#方法重载(overload)方法重写(override)隐藏(new)
一.重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同.这样才能通过传递不同的参数来决定到底调用哪一个. 值得注意的是,方法重载只有通过参数不同来判断调用哪个方法, ...
- php版本哪个没有面向对象,php面向对象的方法重载两种版本比较
多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数. PHP4 中仅仅实现了面向对象的部分的.简单的功能,而 PHP ...
- java 面向对象 重载_Java方法重载
在同一类中具有多个具有相同名称的方法称为方法重载.类中具有相同名称的方法可以是声明的方法,继承的方法或两者的组合. 重载方法必须具有不同数量的参数,不同类型的参数或两者.方法的返回类型,访问级别和th ...
- python3:面向对象(多态和继承、方法重载及模块)
1.多态 同一个方法在不同的类中最终呈现出不同的效果,即为多态. class Triangle:def __init__(self,width,height):self.width = widthse ...
- JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码
构造方法 构造方法(constructor):与类名同名,没有返回值 其初始化作用:一为属性分配内存空间.二为属性赋值 构造方法不能自己调用,只能通过new实例化对象调用 隐式构造方法:对象实例化时编 ...
- Java面向对象-方法与方法重载
方法与方法重载 文章目录 方法与方法重载 一.方法的参数传递 二.构造方法重载 一.方法的参数传递 1.定义带参数的方法 <访问修饰符> 返回类型 <方法名>(<形式参数 ...
- 面向对象基础——方法重载
小结 方法重载是指多个方法的方法名相同,但各自的参数不同: 重载方法应该完成类似的功能,参考String的indexOf(): 重载方法返回值类型应该相同. 在一个类中,我们可以定义多个方法.如果有一 ...
- java学习代码02 范围:方法、方法递归、面向对象、static和this关键字、多态
1.取出大于输入值的最小质数,以7为例,两种方法. public class MethorWork{public static void main(String[] args){panDuanZuiX ...
- JAVA基础-U7 面向对象编程(基础部分)-方法重载
方法重载(Overload) 基本介绍 java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致 eg. System.out.println(); //out是PrintStream类型 ...
最新文章
- UA MATH563 概率论的数学基础 鞅论初步8 鞅收敛定理
- 电脑经验--三星S4显示互联网连接缓慢,网络已被禁用
- 从无主之地看FPS+ARPG游戏的发展方向
- C#操作Excel数据增删改查(转)
- 面试官 | Java中的注解是如何工作的?
- redis安装包_redis安装与调优部署文档(WinServer)
- python安装matplotlib需要c编译_在Python 3.9上安装matplotlib提示需要FreeType更高版本的解决...
- asp:boundfield 鼠标悬停后显示_设计了100张图表后,我学到了哪些经验?
- 带动量的随机梯度下降法_梯度下降法(SGD)原理解析及其改进优化算法
- 从Slice_Header学习H.264(一)--片头语法元素介绍
- java连接数据库配置文件
- PACS管理系统源码 PACS源码
- 【亲测有效】解决电脑不能复制粘贴的几种方法
- Star Way To Heaven 题解
- 小米手机访问电脑共享文件_小米手机共享文件夹在哪里
- Entering emergency mode. Exit the shell to continue.
- 《Caffe Modle Zoo》
- 力争群雄:2012年度IT博客大赛100强脱颖而出
- Ubuntu16.04系统nvidia显卡上图形界面及OpenGL环境搭建心得
- Swing入门级项目全程实录第7讲
热门文章
- 基础数据类型操作(一)——整型、字符串
- JavaSE-21 字符编码简介
- ZOJ 3962:Seven Segment Display(思维)
- OGG之Replicate进程
- Solr 4.3.0 配置Data import handler时出错
- win8/Metro开发系七 win8 对常见数据源的解析及处理 如:xml,json,以及html代码
- Python之上下文管理协议
- HTML 4.01 event 事件
- 程序员修炼之道:从小工到专家读后感02
- [记录] JavaScript 中的字符串操作