免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#中的接口本文中所有图示纯为个人理解(参考了Assembly中元数据的存储方式),与真实情况可能有所出入。 图中绿色表示公有方法,红色表示私有方法。本文将通过以下四个案例来分析C#中的接口究竟是如何工作的。1、公有方法实现接口方法尽管C#在定义接口时不用指明接口方法的访问控制方式,但默认接口方法均为public型(这可以从反编译的IL代码中看到)。下面是使用Reflector查看的接口IL代码.class private interface abstract auto ansi IControl .method public hidebysig newslot abstract virtual instance void Paint() cil managed 实现接口的类需要实现所有接口方法。通常情况下,接口的实现方法也为public型。如下案例:using System ;interface IControl void Paint();public class EditBox: IControl public void Paint() Console.WriteLine(Pain method is called!); class Test static void Main() EditBox editbox = new EditBox(); editbox.Paint(); (IControl)editbox).Paint(); 程序的执行结果为:Pain method is called!Pain method is called!接口就好像是关系型数据库中的一对多表,一个接口对应多个接口方法,每个接口方法又对应虚拟方法表(VMT)中的某个公有或私有方法。上面代码在内存中的镜像可由下图描述:从图中我们可以看到直接对Paint方法的调用以及通过接口对Paint方法的调用。可见通过接口对方法进行调用需要多出一道转换工作,因此执行效率不如直接调用。2、私有方法不能实现接口方法如果想将接口方法直接实现为私有方法是办不到的。下面的EditBox的代码中Paint方法没有特殊说明,默认为private,导致代码无法执行:using System ;interface IControl void Paint();public class EditBox: IControl void Paint() Console.WriteLine(Pain method is called!); public void ShowPaint() this.Paint(); (IControl)this).Paint(); class Test static void Main() EditBox editbox = new EditBox(); editbox.ShowPaint(); 程序在编译时将显示如下编译错误:“EditBox”不会实现接口成员“IControl.Paint()”。“EditBox.Paint()”或者是静态、非公共的,或者有错误的返回类型。”为什么会这样呢?如图:这是由于接口规范中的方法默认的访问权限是public,而类中的默认访问权限是default,也就是说private,因此导致权限范围收缩,两者权限并不相同,所以必须将类的权限调整为public才可以使上面的代码得以执行。 3、实现专门的接口方法(1)代码如下:using System ;interface IControl void Paint();public class EditBox: IControl void Paint() Console.WriteLine(Pain method is called!); void IControl.Paint() Console.WriteLine(IControl.Pain method is called!); public void ShowPaint() this.Paint(); (IControl)this).Paint(); class Test static void Main() EditBox editbox = new EditBox(); editbox.ShowPaint(); /editbox.Paint(); (IControl)editbox).Paint(); EditBox类拥有一私有Paint方法,但这并不是接口方法的实现(上例已经分析过)。EditBox类中还包含了一“void IControl.Paint()”方法, 是该方法复写了接口的Paint方法,该方法是私有的(通过IL代码可以看出)。注意:“void IControl.Paint()”前不能加任何的修饰限定符号,诸如public、private等,这在C#的语法中是不允许的。该方法反编译得到的IL代码如下:.class public auto ansi beforefieldinit EditBox extends object implements IControl . .method private hidebysig newslot virtual final instance void IControl.Paint() cil managed .override IControl:Paint 程序运行时内存中的镜像可简化表示为:程序执行结果如下:Pain method is called!IControl.Pain method is called!IControl.Pain method is called!我们之所以可以通过(IControl)editbox).Paint()方法访问到代码是因为接口方法Paint是公有的。但是我们不能通过editbox.Paint()方法访问到代码是因为EditBox的Paint方法是私有的。 在EditBox内部,通过ShowPaint方法可以同时访问私有的Paint方法与接口IControl.Paint方法。4、实现专门的接口方法(2)如果EditBox中的Pait方法为公有并且同时提供了IControl.Paint方法,程序将是如何运行的呢?代码如下:using System ;interface IControl void Paint();public class EditBox: IControl public void Paint() Console.WriteLine(Pain method is called!); void IControl.Paint() Console.WriteLine(IControl.Pain method is called!); class Test static void Main() EditBox editbox = new EditBox(); editbox.Paint(); (IControl)editbox).Paint(); 程序执行结果如下:Pain method is called!IControl.Pain method is called!程序执行时内存布局如下:可见,EditBox中公有的Paint方法并不是接口实现方法,真
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 特殊染色服务外包合同
- 求编织袋加工外包合同
- 智慧公厕人流计数器维护2025年的合同协议
- 2025年矿山企业安全生产奖惩安全管理规定
- 企业管理-员工奖励申请报告模板
- 新生儿梅毒筛查与护理要点
- 2025年房屋互换协议合同样本三篇
- 护理带教中的临床应用
- 年产汽车配件、农用机械产品配件项目可行性研究报告模板-备案审批
- 护理安全:法律法规的遵守
- 汇能集团招聘考试题库及答案
- T-CBCSA 75-2025《陶瓷砖密缝粘贴工程技术规程》
- 诉前和解协议书
- 设计展览会策划与执行全案
- 公司专家库管理制度
- 《粮食仓储企业重大生产安全事故隐患判定标准(试行)》知识培训
- 个人独资药店章程范本
- 人大代表申请书
- 变电站电缆沟施工方案
- 23- 研制一种施工升降机梯笼门防冲撞装置
- 消防工程师资格考试:气体灭火系统课件
评论
0/150
提交评论