zoukankan      html  css  js  c++  java
  • C#中new和override区别

     
    在C#中实现重写方法,可以用new和override两个关键字来实现,究竟他们之间有什么区别呢?下面,我以例子来说明他们之间的微妙区别:

    public class GrandClass//基类
    {
    public GrandClass()
    {
    Console.WriteLine("In GrandClass.Constructor");
    }
    public virtual void Method()//用virtual才可以在子类中用override,而new不需要这样
    {
    Console.WriteLine("In GrandClass.Method()");
    }
    }

    public class ParentClass:GrandClass//继承基类,看看override状态
    {
    public ParentClass()
    {
    Console.WriteLine("In ParentClass.Constructor");
    }
    public override void Method()//使用override,是说把基类的方法重新定义
    {
    Console.WriteLine("In ParentClass.Method() use override");
    }
    }

    public class NewParentClass:GrandClass//继承基类,看看new状态
    {
    public NewParentClass()
    {
    Console.WriteLine("In NewParentClass.Constructor");
    }
    new public void Method()//使用new,不是说用到基类的方法,而是重新定义一个子类方法,只不过,方法名称与基类相同
    {
    Console.WriteLine("In NewParentClass.Method()");
    }
    }


      下面的调用代码:


    static void Main()
    {
    GrandClass Parent=(GrandClass)new ParentClass();//用override子类加框一个基类对象句柄
    Parent.Method();
    GrandClass NewParent=(GrandClass)new NewParentClass();//用new子类加框一个基类对象句柄
    NewParent.Method();
    NewParentClass NewParent1=new NewParentClass();//一个子类句柄
    NewParent1.Method();
    }


      结果是这样的:


    [1]In GrandClass.Constructor
    [2]In ParentClass.Constructor
    [3]In ParentClass.Method() use override
    [4]In GrandClass.Constructor
    [5]In NewParentClass.Constructor
    [6]In GrandClass.Method()
    [7]In GrandClass.Constructor
    [8]In NewParentClass.Constructor
    [9]In NewParentClass.Method()


      结果前的序号是我自己加的.为了以下的分析:
      [1],[2]两句是GrandClass Parent=(GrandClass)new ParentClass();的结果.(注意一下子类构建器与基类构建器的初始化顺序)
      [3]是Parent.Method();结果.
      [4],[5]两句是GrandClass NewParent=(GrandClass)new NewParentClass();的结果.
      [6]是NewParent.Method();的结果.
      [7],[8]两句是GrandClass NewParent1=(GrandClass)new NewParentClass();的结果.
      [9]是NewParent1.Method();的结果.

      这里我们可以看到,同样是用子类的对象构造一个基类句柄.结果却很明显,可以看到[3][6]的区别.[3]调用了子类的Method(),而[6]调用了基类的Method().
      这说明,override可以覆盖基类的方法,让基类的方法以子类的内容实现,而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已.
    而这一例子的基础是建立在用子类对象加框成基类对象的,目的是实现用基类句柄调用子类方法,以实现重载的多形性.
      如果想调用子类的new方法,用子类的句柄(绝对不能用基类句柄)来调用.结果[9]可以看出来.
      用new是在为子类定义方法名时,实在没有办法定义方法名的情况才与基类的方法相同,但这个方法只在子类中起到作用,而不影响基类的方法.也就是说,new方法就是子类新定义的方法.用override是直正意义上的重载.

  • 相关阅读:
    单源最短路——SPFA算法(Bellman-Ford算法队列优化)
    A Compatible Pair
    欧拉函数知识点总结及欧拉函数打表代码(数论)
    Fafa and the Gates(模拟)
    C语言--链表基础模板
    路由器如何设置上网(TP-LINK)
    学员成绩管理系统
    Bad Cowtractors(最大生成树)
    Agri-Net(最小生成树)
    Median Weight Bead(最短路—floyed传递闭包)
  • 原文地址:https://www.cnblogs.com/xiayong123/p/3717564.html
Copyright © 2011-2022 走看看