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接口是阿里巴巴集团为开发者、商家及第三方服务提供商提供的一系列接口,用于获取和操作天猫平台上的数据。这些接口涵盖了商品管理、订单处理、营销活动、用户信息等多个方面,旨在帮助...
本文实例讲述了C#实现两接口中同名方法。分享给大家供大家参考。具体分析如下: 对于一个类实现两个接口,而这两个接口又有同名方法,C#中的处理方式如下: using System; using System.Collections.Generic; using ...
已经集成微信公众号支付、获取公众号access_token、生成公众号菜单、批量获取关注粉丝列表,微信支付、微信扫码支付、微信订单查询、微信订单退款、微信企业付款。支付宝:支付宝即时到账、支付宝转账、支付宝转账...
* 命令端口:用于存放CPU向接口口发出的一些命令和控制字,以便控制接口口或设备的动作 总线: * 是一组可以同时传输多个数据的公共通信线路 * 是计算机系统中最基本的通信线路 IBM PC总线: * 是IBM PC机中使用...
这句话意味着iLO通常通过Web界面进行操作,但如果Web服务出现故障,IRC(可能是iLO的命令行接口或者一个特定的应急连接工具)可以作为一个备选方案,确保用户仍然能够通过命令行方式接入iLO,执行必要的管理任务。...
本资源摘要信息中,我们将详细介绍汇编语言中关于计算机接口口的知识点。 计算机接口口的概念 计算机接口口是指计算机系统中与外部设备之间的交互接口,负责接收和发送数据、控制信号和状态信息等。它是计算机系统...
本开发包使用简单户无需关心底的通信协议以及原有周边接 口打包解的繁琐过程。同时,该 口打包解的繁琐过程。同时,该 口打包解的繁琐过程。同时,该 口打包解的繁琐过程。同时,该 开发包 支持同步异通信方式,连接...
接头形式代号是钢结构焊接接头的基本组成部分,包括对接接头、TT型接头、C角接接头等。不同的接头形式对应不同的坡口形式和尺寸。 坡口形式代号是钢结构焊接接头的重要组成部分,包括II型坡口、VV型坡口、XX型坡口...
5. GND(接地)接圆口的7脚。 8针圆口(DB9)是标准的串行通信接口,其每个引脚都有特定的功能: 1. RTS(Request To Send)请求发送,用于控制数据传输的启动。 2. DTR(Data Terminal Ready)数据终端就绪,表明...
2. 在8255PA口或PB口的某一口线上产生周期500μS的连续方波,接示波器观察波形。 3. 在8255PC口的PC0-PC3上接4个按键作输入,PC4-PC7上接4个发光二极管作输出,编程实现发光二极管正确指示按键的状态。 实验电路...
随着人们的文化生活和物质生活水平的不断提高,人们对信息交互的需求日 益增强,通信业务量呈现高速增长的趋势"具有高数据速率的用户需求以及具有 高速率!大容量交换能力的核心网...口,实现数据点到点之间的高速!可靠传输
威纶通触摸屏如何通过以太网口连接三菱FX5U系列PLC 威纶通触摸屏(HMI)通过以太网口连接三菱FX5U系列PLC是工业自动化控制系统中的一种常见的应用场景。本文将详细介绍威纶通触摸屏如何通过以太网口连接三菱FX5U...
d) 剥开线内部白色保护层,把屏蔽层接到图7 中椭圆标出的螺丝上,并接网线, A接绿线, B接红线,如图 6,图 7。 编码器接线方法1的优点是屏蔽层接触好,但是缺点是接线方法复杂,不易于操作。 编码器接线方法2: ...
A R M 7内核芯片, 扩展了以太网模块、 串口模块以及 U S B接 口模块, 构成一个支持多接口转换、 多设备 互联的嵌入式装置。本设计可以广泛应用于各种嵌入式 系统 中, 可作为嵌入式 系统、 嵌入式局域 网互 连及...
USB转串口CH340 USB转I并口打印机prote99SEl设计硬件原理图PCB工程文件, 用途: 将并口打印机转换为USB打印机 元器件说明: PCB规格: 普通双面板,板厚1.6mm PCB尺寸: DB36连接器: 40mm * 20.5mm PRT_DB36....
口,还有一些仪器的接口是可选的卡式接口,这些仪器能够很方便的用十 训一算机的程控o Ifu国内仪器大多不带有工EEE488接口,因此我们需要设计 一种带有工EEE488接口的通用单片机系统,也即是一个工EEE488接口卡。 这...
施工临时用水(电)接驳口移交单 .pdf
首先,路由1就不用动了...前提是A路由器已经设置好能正常上网(连接光纤接入或 ADSL猫)。 路由器连接路由器方法一:LAN口连接 这个因为不经过B路由的WAN口,所以相对就简单多了。还是同上,先不要连接A路由,任意一台
接口,另一端是RS232的DB9接口,并且附带了一个USB接口,用于从计算机的USB接 口给验证机具提供电源。 连接时,首先将DB9接头连接到计算机9针串口,将USB取电接口插入旁边的 USB接口。然后将Mini-B接口插入到...