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

来源:网络整理 责任编辑:栏目编辑 发表时间:2013-07-01 03:41 点击:

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

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#制作屏幕捕获程序
    • .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上
    • 遍历ArrayList易犯错误
    • C#对XML操作:一个处理XML文件的类(1)
    • .NET简谈反射(动态调用)
    • 使用C#编写LED样式时钟控件
    • DataList嵌套问题 如何删除内层子DataList的记录
    • 怎样用C#实现完整文档打印功能
    • .NET简谈自定义事务资源管理器
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1