频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

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

来源:网易学院 作者: 出处:巧巧读书 2005-12-05 进入讨论组
  

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

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)

http://www.qqread.com/csharp/u512134000.html进入讨论组讨论。
收藏此文】【 】【打印】【关闭
较早的文章:C#锐利体验(三)

较新的文章:用C#实现木马程序分析
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章