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是直正意义上的重载.  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值