在衍生类中的方法上使用new和override关键字有何意义,可以通过一系列问题来找到答案。先看一段代码:

 1     class Program
2 {
3 static void Main(string[] args)
4 {
5 Child c = new Child();
6 c.Func();
7
8 Console.Read();
9 }
10 }
11
12 class Parent
13 {
14 public void Func()
15 {
16 System.Console.WriteLine("parent");
17 }
18 }
19
20 class Child : Parent
21 {
22 }

  问题1: 以上代码中,子类继承父类,所以可以用子类对象调用Func方法,输出字符串为parent。如果在子类中增加与父类相同的方法Func,会出现什么情况?修改子类代码如下,生成代码是成功的,但是有警告,提示子类的Func方法隐藏了父类的Func方法,如果是有意隐藏,请使用关键字new。

1     class Child : Parent
2 {
3 public void Func()
4 {
5 System.Console.WriteLine("Child");
6 }
7 }

这个问题引出了new关键字,但是看来不使用new关键字一样可以隐藏父类的方法,先加上new关键字消除警告,修改子类代码如下,生成成功且无警告,此时输出字符串为Child。

1     class Child : Parent
2 {
3 public new void Func()
4 {
5 System.Console.WriteLine("Child");
6 }
7 }

  问题2:子类对象赋值给子类变量时,new关键字隐藏了父类方法,似乎并没有太重要的意义,并且new关键字都可以省略,那么看一下子类对象赋值给父类变量时,再调用Func方法结果是什么样的?修改入口Main方法如下

1 static void Main(string[] args)
2 {
3 Parent c = new Child();
4 c.Func();
5
6 Console.Read();
7 }

此时输出字符串为parent,并不是输出的Child,那么说明new关键字的隐藏只针对子类对象赋值给子类变量这种情况。

  问题3:那么如何在子类对象赋值给父类变量情况下,根据该变量调用子类实现的Func方法呢?此时就需要用到override关键字,将子类Func方法的new关键字改为override,修改后的子类代码如下

1     class Child : Parent
2 {
3 public override void Func()
4 {
5 System.Console.WriteLine("Child");
6 }
7 }

生成时报错,提示父类的Func方法未标记为 vitual、abstract 或 override,无法进行重写,所以用override重写父类方法的前提是,父类方法必须为虚方法、抽象方法或重写父类的父类方法(重写爷方法...)。现在修改父类Parent的Func为虚方法,代码如下

1 class Parent
2 {
3 public virtual void Func()
4 {
5 System.Console.WriteLine("parent");
6 }
7 }

生成成功,输出字符串为Child,所以从结果来看,似乎override才是真正的“隐藏”父方法。

总结:

(1)将类的对象赋值给该类的变量,则变量调用的必定是该对象的成员,所以new关键字感觉意义不是很大,编译器甚至都允许省略;

(2)将子类对象赋值给父类变量时,使用override重写后,变量调用的是子类方法实现。

最新文章

  1. swift 手机号码正则表达式 记录一下
  2. 微冷的雨ASP.NET MVC之葵花宝典(MVC)
  3. String、StringBuilder 与 StringBuffer
  4. 别再为了this发愁了------JS中的this机制
  5. python 3.5.2安装mysql驱动报错
  6. (转载)移动WEB前端开发资源整合
  7. yeoman bower grunt等安装
  8. 计算4000000000内的最大f(n)=n值---字符串的问题python实现(五岁以下儿童)
  9. Git回退到服务器某个版本正确姿势
  10. cms系统架构设计
  11. # C# 如何调用动态连接库?
  12. jq动画设置图片抽奖
  13. IntelliJ IDEA详情
  14. ThinkPHP中where()使用方法详解
  15. Codeforces Round #514 (Div. 2)
  16. mes平台的一些方法
  17. Docker数据卷容器
  18. 【POJ】1185 炮兵阵地(状压dp)
  19. C#笔记 -- 协变、逆变
  20. SpringAnnotation之配置AnnotationXML文件

热门文章

  1. python笔记5:函数式编程
  2. [JLOI2015]有意义的字符串
  3. 2016集训测试赛(二十)Problem B: 字典树
  4. recovery怎么刷机,recovery是什么意思
  5. Linux下监听或绑定(bind)21端口失败
  6. 启动mongodb报错问题
  7. .NET Core R2安装及示例教程
  8. AngularJS的过滤器示例
  9. 两段用来启动/重启Linux下Tomcat的Perl脚本
  10. base64加密PHP脚本的解码方法