在衍生类中的方法上使用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(转)的更多相关文章

  1. c#中virtual, abstract和override的区别和用法

    virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能 ...

  2. JAVA - 请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

    请说明"static"关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? "static"关键字表明一个成 ...

  3. C++中的Overload、Override和Overwrite

    在C++语言中有一组基础的概念一直都容易混淆:Overload.Override和Overwrite分别表示什么意思?下面把这三个概念整理一下: 1. Overload(重载) 重载的概念最好理解,在 ...

  4. Android(java)学习笔记148:Eclipse中代码提示去掉@override,不然就报错!

    把项目下载下来后有@Override的注释的方法会报错,如果把@Override去掉就不报错了.经过查阅后发现:@override注释在jdk1.5环境下只能用于对继承的父类的方法的重写,但不能用于对 ...

  5. c#中关于virtual,override和new的理解

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  6. C#中的Virtual、Override和new关键词理解

    来源:http://blog.csdn.net/jackiezhw/article/details/2673992 在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtua ...

  7. Android(java)学习笔记91:Eclipse中代码提示去掉@override,不然就报错!

    1. Eclipse中提示去掉@Override 把项目下载下来后有@Override的注释的方法会报错,如果把@Override去掉就不报错了.经过查阅后发现:@override注释在jdk1.5环 ...

  8. java中的Overload和Override

    Overload为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法 然后再调用时,就会根据不同的参数样式,来选择合适的方法执行 在使用重载时只能通过不同的参数样式. 例 ...

  9. c#中的new和override的实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; /* 简单说,抽象方法是需要 ...

随机推荐

  1. linux定时问题

    手动运行java脚本,可以,但定时运行没效果 查看脚本是否赋予执行权限:若无则赋予可执行权限,若还是没用,则在脚本增添环境变量,百度搜索.

  2. Educational Codeforces Round 34 D. Almost Difference【模拟/stl-map/ long double】

    D. Almost Difference time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  3. HDU 1018 Big Number【斯特林公式/log10 / N!】

    Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. SpringBoot 分包方式多数据源

    1.引入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  5. Oracle SID爆破工具SidGuess

    Oracle SID爆破工具SidGuess   在Oracle中,SID是System IDentifier的缩写.SID是一个数据库的唯一标识符.当用户希望远程连接Oracle数据库时,则需要知道 ...

  6. ELK之logstash收集日志写入redis及读取redis

    logstash->redis->logstash->elasticsearch 1.安装部署redis cd /usr/local/src wget http://download ...

  7. 一个项目多个App项目搭建

    在testDjango项目中找到testDjango文件夹,打开urls.py路由配置文件并添加以下配置 from django.conf.urls import url,includefrom dj ...

  8. 连接Zookeeper操作

    public class ZKConnector implements Watcher{ private static final Logger logger =LoggerFactory.getLo ...

  9. C 位域

    C 位域 如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下: struct { unsigned int widthValidated; unsigned int heightV ...

  10. ListView嵌套两个EditText相关显示问题

    这里说明:本人第一次写博客,可能写的不算太好.可是这个相关类型的研究与拓展,是项目中比較难得的.所以开一篇博客来总结和思考.先让我们看看项目需求. 项目需求说明: 1.须要在点击EditText的时候 ...