zoukankan      html  css  js  c++  java
  • 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重写后,变量调用的是子类方法实现。

  • 相关阅读:
    MyEclipse的优化
    关于学习Hadoop中未总结的资料
    OSChina 的 Tomcat 配置 server.xml
    Linux 定时任务 Crontab命令 详解
    常用Linux命令收集
    SQL练习 高级子查询
    JAVA设计模式中的单例模式
    Linux课程笔记 Rsync数据同步服务
    Linux课程笔记 SSH介绍
    Linux课程笔记 Raid技术介绍
  • 原文地址:https://www.cnblogs.com/lip-blog/p/7363895.html
Copyright © 2011-2022 走看看