在面向对象思想中,由于基本特性--继承所致,产生了子类继承父类的关系,所以出现重载方法。

由于子类对象同事“汇聚了”父类和子类的方法所有公共方法,而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 面向对象--方法重载、隐藏相关推荐

  1. C#方法重载(overload)方法重写(override)隐藏(new)

    一.重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同.这样才能通过传递不同的参数来决定到底调用哪一个. 值得注意的是,方法重载只有通过参数不同来判断调用哪个方法, ...

  2. php版本哪个没有面向对象,php面向对象的方法重载两种版本比较

    多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数. PHP4 中仅仅实现了面向对象的部分的.简单的功能,而 PHP ...

  3. java 面向对象 重载_Java方法重载

    在同一类中具有多个具有相同名称的方法称为方法重载.类中具有相同名称的方法可以是声明的方法,继承的方法或两者的组合. 重载方法必须具有不同数量的参数,不同类型的参数或两者.方法的返回类型,访问级别和th ...

  4. python3:面向对象(多态和继承、方法重载及模块)

    1.多态 同一个方法在不同的类中最终呈现出不同的效果,即为多态. class Triangle:def __init__(self,width,height):self.width = widthse ...

  5. JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码

    构造方法 构造方法(constructor):与类名同名,没有返回值 其初始化作用:一为属性分配内存空间.二为属性赋值 构造方法不能自己调用,只能通过new实例化对象调用 隐式构造方法:对象实例化时编 ...

  6. Java面向对象-方法与方法重载

    方法与方法重载 文章目录 方法与方法重载 一.方法的参数传递 二.构造方法重载 一.方法的参数传递 1.定义带参数的方法 <访问修饰符> 返回类型 <方法名>(<形式参数 ...

  7. 面向对象基础——方法重载

    小结 方法重载是指多个方法的方法名相同,但各自的参数不同: 重载方法应该完成类似的功能,参考String的indexOf(): 重载方法返回值类型应该相同. 在一个类中,我们可以定义多个方法.如果有一 ...

  8. java学习代码02 范围:方法、方法递归、面向对象、static和this关键字、多态

    1.取出大于输入值的最小质数,以7为例,两种方法. public class MethorWork{public static void main(String[] args){panDuanZuiX ...

  9. JAVA基础-U7 面向对象编程(基础部分)-方法重载

    方法重载(Overload) 基本介绍 java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致 eg. System.out.println(); //out是PrintStream类型 ...

最新文章

  1. UA MATH563 概率论的数学基础 鞅论初步8 鞅收敛定理
  2. 电脑经验--三星S4显示互联网连接缓慢,网络已被禁用
  3. 从无主之地看FPS+ARPG游戏的发展方向
  4. C#操作Excel数据增删改查(转)
  5. 面试官 | Java中的注解是如何工作的?
  6. redis安装包_redis安装与调优部署文档(WinServer)
  7. python安装matplotlib需要c编译_在Python 3.9上安装matplotlib提示需要FreeType更高版本的解决...
  8. asp:boundfield 鼠标悬停后显示_设计了100张图表后,我学到了哪些经验?
  9. 带动量的随机梯度下降法_梯度下降法(SGD)原理解析及其改进优化算法
  10. 从Slice_Header学习H.264(一)--片头语法元素介绍
  11. java连接数据库配置文件
  12. PACS管理系统源码 PACS源码
  13. 【亲测有效】解决电脑不能复制粘贴的几种方法
  14. Star Way To Heaven 题解
  15. 小米手机访问电脑共享文件_小米手机共享文件夹在哪里
  16. Entering emergency mode. Exit the shell to continue.
  17. 《Caffe Modle Zoo》
  18. 力争群雄:2012年度IT博客大赛100强脱颖而出
  19. Ubuntu16.04系统nvidia显卡上图形界面及OpenGL环境搭建心得
  20. Swing入门级项目全程实录第7讲

热门文章

  1. 基础数据类型操作(一)——整型、字符串
  2. JavaSE-21 字符编码简介
  3. ZOJ 3962:Seven Segment Display(思维)
  4. OGG之Replicate进程
  5. Solr 4.3.0 配置Data import handler时出错
  6. win8/Metro开发系七 win8 对常见数据源的解析及处理 如:xml,json,以及html代码
  7. Python之上下文管理协议
  8. HTML 4.01 event 事件
  9. 程序员修炼之道:从小工到专家读后感02
  10. [记录] JavaScript 中的字符串操作