C#中的new和override(转)
在衍生类中的方法上使用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重写后,变量调用的是子类方法实现。
C#中的new和override(转)的更多相关文章
- c#中virtual, abstract和override的区别和用法
virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能 ...
- JAVA - 请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
请说明"static"关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? "static"关键字表明一个成 ...
- C++中的Overload、Override和Overwrite
在C++语言中有一组基础的概念一直都容易混淆:Overload.Override和Overwrite分别表示什么意思?下面把这三个概念整理一下: 1. Overload(重载) 重载的概念最好理解,在 ...
- Android(java)学习笔记148:Eclipse中代码提示去掉@override,不然就报错!
把项目下载下来后有@Override的注释的方法会报错,如果把@Override去掉就不报错了.经过查阅后发现:@override注释在jdk1.5环境下只能用于对继承的父类的方法的重写,但不能用于对 ...
- c#中关于virtual,override和new的理解
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- C#中的Virtual、Override和new关键词理解
来源:http://blog.csdn.net/jackiezhw/article/details/2673992 在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtua ...
- Android(java)学习笔记91:Eclipse中代码提示去掉@override,不然就报错!
1. Eclipse中提示去掉@Override 把项目下载下来后有@Override的注释的方法会报错,如果把@Override去掉就不报错了.经过查阅后发现:@override注释在jdk1.5环 ...
- java中的Overload和Override
Overload为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法 然后再调用时,就会根据不同的参数样式,来选择合适的方法执行 在使用重载时只能通过不同的参数样式. 例 ...
- c#中的new和override的实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; /* 简单说,抽象方法是需要 ...
随机推荐
- Spark-RDD之 zip
zip这个函数是在scala中的,spark中也应用于RDD类型 val posLeftRDD = FreqDic1.map(line => line._1) zip sc.paralleliz ...
- Codeforces 583 DIV2 Asphalting Roads 模拟
原题链接:http://codeforces.com/problemset/problem/583/A 题意: 很迷很迷,表示没看懂..但是你看样例就秒懂了 题解: 照着样例模拟就好 代码: #inc ...
- 窗体皮肤实现 - 增加Toolbar的交互性
稍微改造一下,让交互性更好点.增加提示和动态效果. 控件实现内容: 1.加入Hint提示 2.加入了简易动画效果,鼠标进入和离开会有个渐变效果. 实现方案: 1.基类选用 2.Action的关联 3. ...
- java基础篇2之枚举
1.为什么要有枚举 问题:要定义星期几或者性别的变量,该怎么定义? 假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0; 枚举就是要让某个类型的变量的取值只能为若干个固定值 ...
- 2017.2.28 activiti实战--第七章--Spring容器集成应用实例(五)普通表单
学习资料:<Activiti实战> 第七章 Spring容器集成应用实例(五)普通表单 第六章中介绍了动态表单.外置表单.这里讲解第三种表单:普通表单. 普通表单的特点: 把表单内容写在 ...
- 2016.6.21 eclipse配置server locations时按钮为灰色
我在使用eclipse配置Tomcat服务器的时候发现,默认情况下Tocmat把我们部署的项目放在了workspaces下面,需要手动修改将其放在tomcat的安装路径下的webapp内. 从图中可以 ...
- mysql if()一个奇怪的问题
看起来一切正常......... 但是当使用不等于时 SELECT IF(1!=NULL,1,2) 居然返回2 SELECT IF(1!=NULL,1,2) >2 -- ------------ ...
- ps快捷键记录
alt+delete 前景色填充 ctrl+delete 背景色填充 alt+shift+鼠标调节 变换选取,做圆环 ctrl+t 自由变换 alt+鼠标拖动 快捷复制某区域 delete ...
- bottle的几个小坑
距离我在<web.py应用工具库:webpyext>里说要换用bottle,已经过去快两个月了--事实上在那之前我已经開始着手在换了.眼下那个用于 Backbone.js 介绍的样例程序已 ...
- sprint3 【每日scrum】 TD助手站立会议第六天
站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 在添加日程类型处添加了选择闹钟间隔多长时间相应,并写了闹钟运行的类 在日历各个事件上都增加闹钟显示,并将数据传递给日程和时间表 感觉跟楠哥在设 ...