`

接 口

    博客分类:
  • CLR
 
阅读更多

CLR不支持多继承(因而所有托管编程语言也不支持)。CLR只是通过接口提供了"缩水版"的多继承。

 

接口可以定义事件、无参属性、索引器,这些东西本质上都是方法,它们只是对语法的一种简化而已。接口不能定义构造器方法,不能定义实例字段。虽然CLR允许接口定义静态方法、静态字段、常量、静态构造器,但C#禁止接口定义这些静态成员。

 

对于一个接口方法(类继承接口所实现的方法)C#编译器要求接口方法标记为public,CLR要求接口方法标记为virtual(这样派生类可以重写该方法,如果没有显示标记virtual,将默认标记为virtual sealed(派生类将不能重写该方法))。

 

隐式接口方法和显示接口方法的实现

看以下代码:

internal class SimpleType:IDisposable

{

    public void Dispose(){ Console.WriteLine("Dispose");}

}

以上看似只有一个方法(确实只有一个方法,呵呵),该方法是一个隐式接口方法。但在该类加载到CLR时,该类的方法表里指向这个方法的记录项却又两个,一个是接口方法的记录项,一个是新方法的记录项(因为这个方法的签名与IDisposable接口定义的Dispose()方法完全一致,且可访问性是public)

public class Program{

    public static void Main(){

        SimpleType st=new SimpleType();

        st.Dispose();         //Dispose

        IDisposable d=st;

        d.Dispose();          //Dispose

    }

}

看以上代码, st.Dispose()和d.Dispose()都指向同一个隐式接口方法

如果将SimpleType类写成如下:

internal class SimpleType:IDisposable

{

    public void Dispose(){ Console.WriteLine("Dispose");}

    void IDisposable.Dispose(){Console.WriteLine("IDispose");}

}

运行Main()方法的结果将是:

Dispose

IDispose

其中void IDisposable.Dispose(){Console.WriteLine("IDispose");}是显示接口方法,这样接口方法的记录项会指向该显示接口方法,而新方法的记录项会指向 public void Dispose(){ Console.WriteLine("Dispose");}

在C#中将定义方法的那个接口的名称作为方法名的前缀(如这里的 IDisposable.Dispose)称为显示接口方法实现(EIMI)。定义EIMI时不能指定可访问性,默认是private。要调用EIMI时只能通过接口类型的一个变量来进行。另外,EIMI不能标记为virtual,所以它不能被重写。

 

泛型接口有一个好处是类可以实现同一个接口若干次,只要每次使用不同的类型参数:

//该类实现了IComparable<T>接口两次

public class Number:IComparable<Int32>,IComparable<String>

{

    private Int32 m_val=5;

    public Int32 CompareTo(Int32 n)

    {

        return m_val.CompareTo(n);

    }

    public Int32 CompareTo(string s)

    {

       return m_val.CompareTo(Int32.Parse(s));

    }

}

 

定义实现多个接口的一个类型时,这些接口有可能定义了具有相同名称和签名(返回值及参数)的方法:

public interface IWindow{

   Object GetMenu();

}

public interface IRestaurant{

   Object GetMenu();

}

要定义一个实现了以上俩接口的类型,必须用 显示接口方法实现:

public class MarioPizzeria:IWindow,IRestaurant

{   //这是IWindow的GetMenu()方法实现

    Object IWindow.GetMenu(){...}

    //这是IRestaurant的GetMenu()方法实现

    Object IRestaurant.GetMenu(){...}

    //这个GetMenu()方法是可选的,与接口无关

    public Object GetMenu(){...}

}

 

 

 

未完待续...

分享到:
评论

相关推荐

    天猫 api 接口

    **天猫API接口详解** 天猫API接口是阿里巴巴集团为开发者、商家及第三方服务提供商提供的一系列接口,用于获取和操作天猫平台上的数据。这些接口涵盖了商品管理、订单处理、营销活动、用户信息等多个方面,旨在帮助...

    C#实现两接口中同名方法实例分析

    本文实例讲述了C#实现两接口中同名方法。分享给大家供大家参考。具体分析如下: 对于一个类实现两个接口,而这两个接口又有同名方法,C#中的处理方式如下: using System; using System.Collections.Generic; using ...

    thinkphp5集成微信支付和支付宝支付接 口.rar

    已经集成微信公众号支付、获取公众号access_token、生成公众号菜单、批量获取关注粉丝列表,微信支付、微信扫码支付、微信订单查询、微信订单退款、微信企业付款。支付宝:支付宝即时到账、支付宝转账、支付宝转账...

    微型计算机接口技术:第三章 IO接口与总线.ppt

    * 命令端口:用于存放CPU向接口口发出的一些命令和控制字,以便控制接口口或设备的动作 总线: * 是一组可以同时传输多个数据的公共通信线路 * 是计算机系统中最基本的通信线路 IBM PC总线: * 是IBM PC机中使用...

    HPE服务器管理口远程连接工具IRC

    这句话意味着iLO通常通过Web界面进行操作,但如果Web服务出现故障,IRC(可能是iLO的命令行接口或者一个特定的应急连接工具)可以作为一个备选方案,确保用户仍然能够通过命令行方式接入iLO,执行必要的管理任务。...

    四川大学计算机学院汇编语言chPPT课件.ppt

    本资源摘要信息中,我们将详细介绍汇编语言中关于计算机接口口的知识点。 计算机接口口的概念 计算机接口口是指计算机系统中与外部设备之间的交互接口,负责接收和发送数据、控制信号和状态信息等。它是计算机系统...

    恒生期货周边接入开发包SDK_用户手册

    本开发包使用简单户无需关心底的通信协议以及原有周边接 口打包解的繁琐过程。同时,该 口打包解的繁琐过程。同时,该 口打包解的繁琐过程。同时,该 口打包解的繁琐过程。同时,该 开发包 支持同步异通信方式,连接...

    钢结构常用焊接接头坡口形式分类图集.doc

    接头形式代号是钢结构焊接接头的基本组成部分,包括对接接头、TT型接头、C角接接头等。不同的接头形式对应不同的坡口形式和尺寸。 坡口形式代号是钢结构焊接接头的重要组成部分,包括II型坡口、VV型坡口、XX型坡口...

    USB-SC09-FX三菱编线与8针圆口接线方法.docx

    5. GND(接地)接圆口的7脚。 8针圆口(DB9)是标准的串行通信接口,其每个引脚都有特定的功能: 1. RTS(Request To Send)请求发送,用于控制数据传输的启动。 2. DTR(Data Terminal Ready)数据终端就绪,表明...

    单片机可编程并行接口芯片8255的应用实验.docx

    2. 在8255PA口或PB口的某一口线上产生周期500μS的连续方波,接示波器观察波形。 3. 在8255PC口的PC0-PC3上接4个按键作输入,PC4-PC7上接4个发光二极管作输出,编程实现发光二极管正确指示按键的状态。 实验电路...

    基于FPGA的高速异构接入交换机网络接口研究--北京邮电大学

    随着人们的文化生活和物质生活水平的不断提高,人们对信息交互的需求日 益增强,通信业务量呈现高速增长的趋势"具有高数据速率的用户需求以及具有 高速率!大容量交换能力的核心网...口,实现数据点到点之间的高速!可靠传输

    威纶通触摸屏如何通过以太网口连接三菱FX5U系列PLC

    威纶通触摸屏如何通过以太网口连接三菱FX5U系列PLC 威纶通触摸屏(HMI)通过以太网口连接三菱FX5U系列PLC是工业自动化控制系统中的一种常见的应用场景。本文将详细介绍威纶通触摸屏如何通过以太网口连接三菱FX5U...

    编码器接线规范[归纳].pdf

    d) 剥开线内部白色保护层,把屏蔽层接到图7 中椭圆标出的螺丝上,并接网线, A接绿线, B接红线,如图 6,图 7。 编码器接线方法1的优点是屏蔽层接触好,但是缺点是接线方法复杂,不易于操作。 编码器接线方法2: ...

    基于ARM的多功能接口互联系统设计.PDF

    A R M 7内核芯片, 扩展了以太网模块、 串口模块以及 U S B接 口模块, 构成一个支持多接口转换、 多设备 互联的嵌入式装置。本设计可以广泛应用于各种嵌入式 系统 中, 可作为嵌入式 系统、 嵌入式局域 网互 连及...

    USB转串口CH340 USB转I并口打印机prote99SEl设计硬件原理图PCB工程文件.zip

    USB转串口CH340 USB转I并口打印机prote99SEl设计硬件原理图PCB工程文件, 用途: 将并口打印机转换为USB打印机 元器件说明: PCB规格: 普通双面板,板厚1.6mm PCB尺寸: DB36连接器: 40mm * 20.5mm PRT_DB36....

    带有!EEE488接口的通用单片机系统方案设计与研究

    口,还有一些仪器的接口是可选的卡式接口,这些仪器能够很方便的用十 训一算机的程控o Ifu国内仪器大多不带有工EEE488接口,因此我们需要设计 一种带有工EEE488接口的通用单片机系统,也即是一个工EEE488接口卡。 这...

    施工临时用水(电)接驳口移交单 .pdf

    施工临时用水(电)接驳口移交单 .pdf

    路由器连接路由器方法一:LAN口连接.txt

    首先,路由1就不用动了...前提是A路由器已经设置好能正常上网(连接光纤接入或 ADSL猫)。 路由器连接路由器方法一:LAN口连接 这个因为不经过B路由的WAN口,所以相对就简单多了。还是同上,先不要连接A路由,任意一台

    神思第二代身份证验证系统

    接口,另一端是RS232的DB9接口,并且附带了一个USB接口,用于从计算机的USB接  口给验证机具提供电源。  连接时,首先将DB9接头连接到计算机9针串口,将USB取电接口插入旁边的  USB接口。然后将Mini-B接口插入到...

Global site tag (gtag.js) - Google Analytics