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

是直正意义上的重载. 





文章来自: 无缘_无故的空间
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.