接口

翻译 2012年03月21日 13:36:54

 如果一个类派生于一个接口,它就会执行某些函数。并不是所有的面向对象语言都支持接口。

尽管在概念上C#接口类似于COM接口,但它们是不同的,底层的结构不同,例如,C#接口并不派生于IUnknown。C#接口根据.NET函数提供了一个契约。与COM接口不同,C#接口不代表任何类型的二进制标准。

 

下面列出Microsoft预定义的一个接口System.IDisposable的完整定义。IDisposable包含一个方法Dispose(),该方法由类执行,用于清理代码:

public interface IDisposable
{
void Dispose();
}

上面的代码说明,声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。

一般情况下,接口中只能包含方法、属性、索引器和事件的声明

不能实例化接口,它只能包含其成员的签名。接口不能有构造函数(如何构建不能实例化的对象?)或字段(因为这隐含了某些内部的执行方式)。接口定义也不允许包含运算符重载,但这不是因为声明它们在原则上有什么问题,而是因为接口通常是公共契约,包含运算符重载会引起一些与其他.NET语言不兼容的问题,例如与VB的不兼容,因为VB不支持运算符重载。

IDisposable。如果类希望声明为公共类型,以便执行方法Dispose(),该类就必须执行IDisposable。在C#中,这表示该类派生于IDisposable。

lass SomeClass : IDisposable
{
// this class MUST contain an implementation of the
// IDisposable.Dispose() method, otherwise
// you get a compilation error
public void Dispose()
{
// implementation of Dispose() method
}
// rest of class
}

在这个例子中,如果SomeClass派生于IDisposable,但不包含与IDisposable中签名相同的Dispose()实现代码,就会得到一个编译错误,因为该类破坏了实现IDisposable的契约。当然,编译器允许类有一个不派生于IDisposable的Dispose()方法。问题是其他代码无法识别出SomeClass支持IDisposable特性

注意:

IDisposable是一个相当简单的接口,它只定义了一个方法。大多数接口都包含许多成员。

接口的另一个例子是C#中的foreach循环。实际上,foreach循环的内部工作方式是查询对象,看看它是否实现了System.Collections.IEnumerable接口。如果是,C#编译器就插入IL代码,使用这个接口上的方法迭代集合中的成员,否则,foreach就会引发一个异常。

宽接口和窄接口

     宽接口和窄接口,这是设计当中经常会遇到的一个选择。宽接口通常能够让一个类功能强大,但有时容易失去真正的关注点从而破坏了“单一职责原则”。窄接口则比较容易确保对某一特定点的关注。设计中经常可以...
  • cxzhq2002
  • cxzhq2002
  • 2010年11月14日 18:48
  • 1546

类与类,类与接口,接口与接口的关系

类与类,类与接口,接口与接口的关系 a:类与类 *继承关系,只能单继承,可以多层继承 b:类与接口 *实现关系,可以单实现,也可以多实现 *并且还可以在继承一个类的同时实现多个接口 ...
  • uotail
  • uotail
  • 2017年05月03日 22:17
  • 416

接口和实现的命名方式

在看别人的spring项目的时候,发现所有的service都是一个接口和一个或者多个实现,如果说有多个实现定义一个接口,也说得过去,只有一个接口,为什么要定义成接口呢? 接口(int...
  • feigeswjtu
  • feigeswjtu
  • 2017年05月13日 16:45
  • 2745

抽象接口的作用

抽象接口的目的是为了实现子类的功能高度集中而存在的。   一般情况下,实现类必须全部实现所继承接口的方法,可是有些方法却显得多余,为了避免这样的现象,出现了抽象接口。 比如   :一般用一个过渡的...
  • libaolin198706231987
  • libaolin198706231987
  • 2015年11月18日 20:00
  • 1003

Swift学习 接口的创建与使用

Swift学习 接口的创建与使用
  • billhepeng
  • billhepeng
  • 2015年07月21日 19:09
  • 2763

一些常用免费接口

转自:http://www.cnblogs.com/mengxingxinqing/p/4401973.html 百度天气接口示例: 1.http://api.map.baidu.c...
  • kaka_2014
  • kaka_2014
  • 2016年12月05日 09:35
  • 5066

java native 接口的使用

java native 接口 Java 与 C/C++ 混编 jni
  • qianguozheng
  • qianguozheng
  • 2010年10月19日 20:52
  • 1245

网管“北向接口”与“南向接口”

北向接口 北向接口(Northbound Interface)提供给其他厂家或运营商进行接入和管理的接口,即向上提供的接口。它是驻留在底层网管上的一个进程,与通常所说的Agent功能相同,负责处理来...
  • u011804580
  • u011804580
  • 2014年10月30日 10:19
  • 2283

迭代神器-Iterator接口

一 Iterator接口基础1 Iterator接口概述Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样:Collection系列集合、Map系列...
  • chengqiuming
  • chengqiuming
  • 2017年04月12日 09:43
  • 839

Unity3D架构之第一弹 《善用接口》

最近好久没有认真的写过博客啦,此时不知为何突然有此意,暂且将原因归为刚看过的一篇微信吧,,,90后只发说说,不写博客 由于u3d开发和以前写过的.net开发有所不同,以前做.net时会经常用...
  • MyLeftEyeIsL
  • MyLeftEyeIsL
  • 2015年10月20日 00:57
  • 2165
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:接口
举报原因:
原因补充:

(最多只允许输入30个字)