动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   .Net → 阅读文章

 实现Interface的函数总是虚函数么?

作者来源: 
阅读 数 498 人次 , 2006-4-27 10:05:00 

  

    以下这段代码有编译错误:

public interface IExample

{

void ShowExampe(string example);

}

public class DetailedExample : IExample

{

public void ShowExampe(string example) //Line 7

{

//implementation detail

}

}

public class BlogDetailedExample : DetailedExample

{

public override void ShowExampe(string example) //Line 14

{

//My override

}

}

    错误代码是CS0506: \\\\\\\'function1\\\\\\\' : cannot override inherited member \\\\\\\'function2\\\\\\\' because it is not marked "virtual", "abstract", or "override"。从此我们也许可以推断出第七行的ShowExample不是虚函数。实际上,它是虚函数,至少从IL代码可以看到virtual的标记:
method public hidebysig newslot virtual final instance void ShowExampe(string example) cil managed

 

    但是我们注意到了final的使用,这使得此虚函数不可以再被override. 现在将第七行改成 public virtual void ShowExampe(string example) 则可以使得代码编译通过。此时其IL就和类自己定义的(而不是通过实现interface得到的)虚函数一样了:
.method public hidebysig newslot virtual instance void ShowExampe(string example) cil managed

 

    当然我们也可以将类DetailedExample改成abstract(抽象)类也使得编译成功,这也和类自己定义的其他抽象函数一样。

  public abstract class DetailedExample : IExample

  {

    public abstract void ShowExampe(string example);

  }

ShowExample的IL代码如下:
.method public hidebysig newslot abstract virtual instance void ShowExampe(string example) cil managed

 

    所以编译器只是对于未使用virtual或者abstract的interface函数实现做了特别的处理,使得它是虚函数,但是final的函数实现所以不可以再被override. 回答标题的问题,答案是肯定的。

 

    在C#之中,标记一个虚函数为final的关键字是sealed。如第十四行就可以这样写.

public sealed override void ShowExampe(string example)

  
 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:用C#实现木马程序分析
· 下一篇:用Visual C#向Excel2002传输XML数据
· 初探ERP的数据库框架
· 从VB 6.0到VB.NET的转换(2)
· 运行时拉伸和移动控件的类
· 使用 ASP+ 列表绑定控件(下)
· C#中的代理(delegate)


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077