注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

浅析C# new和override的区别  

2011-01-25 10:21:05|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C#中new和override是继承中经常用到的两个关键字,但是往往有时候容易把这两个关键字的作用搞混淆。

 

new

C# new关键字表示隐藏,是指加上new关键字的属性或函数将对本类和继承类隐藏基类的同名属性或函数

 

public class A
{
    public virtual void Method()
    {
        Console.WriteLine("This Method in Class A!");
    }
}

public class B : A
{
    public new void Method()
    {
        Console.WriteLine("This Method in Class B!");
    }
}
对于上面这个例子来说,假如运行A a=new B();a.Method();会输出This Method in Class A!,这是因为class B继承于class A,现在B中的Method函数隐藏A中的Method,所以从B(包括继承于B的子类)的角度来看类中的Method就是B.Method,A的Method不可见,但是如果从A的角度来看B,A只认识类B中继承于类A的Method函数,对于B类中的Method它不可见,所以A a=new B();a.Method();相当于是调用了类B中继承于A的Method函数

 

浅析C new和override的区别 - 海里的贝壳 - apple的博客

 

 

override

C#中override关键字表示重写,对于加上override关键字的属性或函数将完全覆盖基类的同名虚属性或虚函数,使基类的虚属性和虚函数在整个继承链中都不可见(在子类中用base关键字调用除外)。

public class A
{
    public virtual void Method()
    {
        Console.WriteLine("This Method in Class A!");
    }
}

public class B : A
{
    public override void Method()
    {
        Console.WriteLine("This Method in Class B!");
    }
}
对于上面这个例子来说,假如运行A a=new B();a.Method();会输出This Method in Class B!,因为class B的Method函数完全覆盖基类的同名虚函数Method,使整个继承链中看见的Method函数都是B中的Method,所以就算是以A角度来看B,A看到的Method函数也是B中的Method,因为A中的Method完全被B的覆盖了

 

浅析C new和override的区别 - 海里的贝壳 - apple的博客

 

但是如果要在B的对象中调用A的Method函数还是有办法,就是使用base关键字,比如

public class A
{
    public virtual void Method()
    {
        Console.WriteLine("This Method in Class A!");
    }
}

public class B : A
{
    public override void Method()
    {
        base.Method();
    }
}
A a=new B();a.Method();会输出This Method in Class A!,base.Method();表示调用类B中继承于基类A的Method

 

new、override与interface

接口在相互继承的时候也会隐藏基接口的同名属性或函数,但是对于接口来说很特殊,隐藏对于基接口来说是不起作用的,接口内部的属性和函数都只是声明,它们都指向实现接口的类中的同名实现函数,通过接口调用接口的属性和函数的时候都会去调用实现类中从上到下最先可见的同名函数和同名属性:

public interface IA
{
    void Method();
}

public interface IB : IA
{
    new void Method();
}

public class IClass:IB
{
    public void Method()
    {
        Console.WriteLine("This Method in Class IClass!");
    }
}

public class ISubClass : IClass
{
    public new void Method()
    {
        Console.WriteLine("This Method in Class ISubClass!");
    }
}
IA ia = new ISubClass();ia.Method();输出This Method in Class IClass!因为对于ia来说在继承链中最先见到的同名实现函数是类IClass的Method函数

 

浅析C new和override的区别 - 海里的贝壳 - apple的博客

 

 

把上面的例子稍作修改:

public interface IA
{
    void Method();
}

public interface IB : IA
{
    new void Method();
}

public class IClass:IB
{
    public virtual void Method()
    {
        Console.WriteLine("This Method in Class IClass!");
    }
}

public class ISubClass : IClass
{
    public override void Method()
    {
        Console.WriteLine("This Method in Class ISubClass!");
    }
}
IA ia = new ISubClass();ia.Method();输出This Method in Class ISubClass!因为继承链中的Method函数都被ISubClass的Method覆盖了,所以对于ia来说在继承链中最先见到的同名实现函数是类ISubClass的Method函数

 

浅析C new和override的区别 - 海里的贝壳 - apple的博客

 

     
本文引用地址: 
 

摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/kf/201009/75124.html

  评论这张
 
阅读(991)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017