接口(interface)
接口(interface)
接口(interface)定义了一个可由类和结构实现的协定。接口可以包含方法、属性、事件和索引器。接口不提供它所定义的成员的实现-它仅指定实现该接口的类或结构必须提供的成员。
è 一个接口声明可以声明零个或多个成员。
è 接口的成员必须是方法、属性、事件或索引器。
è 接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。
è 所有接口成员都隐式地具有public访问属性。
è 接口成员声明中包含任何修饰符都属于编译时错误。具体来说,不使用修饰符abstract、public、protected、internal、private、virtual、override或static来声明接口成员。
完全限定接口成员名:
接口成员有时也用它的完全限定名(fully qualified name)来引用。接口成员的完全限定名是这样组成的:声明该成员的接口的名称,后跟一个点,再后跟该成员的名称。成员的完全限定名将引用声明该成员的接口。
显式接口成员实现:
为了实现接口,类或结构可以声明显式接口成员实现(explicit interface member implementation) 显式接口成员实现就是一种方法、属性、事件或索引器声明,它使用完全限定接口成员名称作为标识符。
显式接口成员实现有两个主要用途:
->由于显式接口成员实现不能通过类或结构实例来访问,因此它们就不属于类或结构的自身的公共接口。当需在一个公用的类或结构中实现一些仅供内部使用(不允许外界访问)的接口时,这就特别有用。
->显式接口成员实现可以消除因同时含有多个相同签名的接口成员所引起的多义性。如果没有显式接口成员实现,一个类或结构就不可能为具有相同签名和返回类型的接口成员分别提供相应的实现,也不可能为具有相同签名和不同返回类型的所有接口成员中的任何一个提供实现。
->在方法调用、属性访问或索引器访问中,不能直接访问“显式接口成员实现”的成员,即使用它的完全限定名也不行。“显式接口成员实现”的成员只能通过接口实例访问,并且在通过接口实例访问时,只能用该接口成员的简单名称来引用。
->显式接口成员实现中包含访问修饰符属于编译时错误,而且如果包含abstract、virtual、override或static修饰符也属于编译时错误。
->显式接口成员实现具有与其它成员不同的可访问性特征。由于显式接口成员实现永远不能在方法调用或属性访问中通过它们的完全限定名来访问,因此,它们似乎是private(私有的)。但是,因为它们可以通过接口实例来访问,所以它们似乎又是public(公共的)。
接口的多继承:
看一段代码:
using System ;
interface IA
{
void F();
}
interface IB:IA{
new void F();
}
interface IC:IA
{
void G();
}
interface IBC: IB,IC
{
}
class Derive:IBC
{
public void F()
{
Console .WriteLine ("IB.F()");
}
public void G()
{
Console .WriteLine ("IC.G()");
}
}
class Test
{
static void Main()
{
Derive d=new Derive();
d.F();
((IA)d).F();
((IB)d).F();
((IC)d).F();
((IBC)d).F();
}
}
输出: IB.F()
IB.F()
IB.F()
IB.F()
IB.F()
接口的重新实现:
->一个类若继承了某个接口的实现,则只要将该接口列入它的基类列表中,就可以重新实现该接口。
->接口的重新实现与接口的初始实现遵循完全相同的接口映射规则。因此,继承的接口映射不会对为重新实现该接口而建立的接口映射产生任何影响。
看一段代码:
using System ;
interface IA
{
void F();
}
class B:IA
{
void IA.F() //显式接口实现
{
Console .WriteLine ("B.F");
}
}
class C:B,IA
{
public void F()
{
Console .WriteLine ("C.F");
}
}
class Test
{
static void Main()
{
C c=new C ();
((IA)c).F();
}
}
输出:C.F
接口与抽象类:
1. 类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类。接口只是一个行为的规范或规定。接口表述的是“我能做”(Can-do),抽象类更多的是定义在一系列紧密相关的类间(Is-a),而接口大多数是关系疏松但都实现某一功能的类中。
2. 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
3. 一个类一次可以实现若干个接口,但是只能扩展一个父类;
4. 抽象类实现了OOP中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义不可变的,而把可变的由子类去实现;
5. 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
6. 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。
接口与抽象类:
1. 抽象类用于部分实现一个类,再由用户按需求对其进行不同的扩展和完善;接口只是定义一个行为的规范或规定。
2. 抽象类在组件的所有实现间提供通用的已实现功能;接口创建在大范围全异对象间使用的功能。
3. 抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
4. 抽象类主要用于设计大的功能单元;而接口用于设计小而简练的功能块。
接口:
定义:接口就是语义相关的一个或多个抽象成员组成的命名集合。接口表示的是指定的类或结构需要支持的行为。
->接口包含的成员不带访问修饰符(因为所有接口成员都隐式规定为公共(public)和抽象(abstract)的。
->所有在接口中定义的成员都必须在要实现它的类或结构中实现。
接口与抽象类的对比:
->相同点: 当一个类派生自抽象基类时, 它必须实现抽象方法的细节(倘若派生类没有声明为抽象的)
->不同点: 抽象基类不只能够定义一组抽象方法,还可以指定公用的、私有的和受保护的状态数据以及许多可被子类访问的实体方法。
如何动态判断一个类型支持哪些接口?
1. 显式强制转换: IPointy a =( IPointy)b; 需要使用结构化异常处理;不推荐。
2. as关键字(获取接口引用):可以在使用该关键字的语句中得到指向该对象接口的引用;否则,将返回一个值为null的空引用。
IPointy a = b as IPointy; if(a!=null) { } else { }
3. is关键字(获取接口引用): 如果要考察的对象与指定接口不符,将返回false值。
If ( b is IPointy) { } else { }
显式接口实现:
->不能在定义显式实现成员时加访问修饰符。
接口(interface)的更多相关文章
- java中的接口interface
关于接口 接口描述了实现了它的类拥有什么功能.因为Java是强类型的,所以有些操作必须用接口去约束和标记.接口作为类的能力的证明,它表明了实现了接口的类能做什么. 类似与class,interface ...
- php中的抽象类(abstract class)和接口(interface)
一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...
- 14 接口-interface的定义与实现
接口的基本语法一: 1.使用interface 定义 2.接口当中的方法都是抽象方法 3.接口当中的方法都是public权限 接口的定义: interface USB { public void re ...
- C#编程利器之三:接口(Interface)【转】
C#编程利器之三:接口(Interface) C#接口是一个让很多初学者容易迷糊的东西,用起来好象很简单,定义接口,然后在里面定义方法,通过继承与他的子类来完成具体的实现.但没有真正认识接口的作用的时 ...
- 为什么不能把委托(delegate)放在一个接口(interface)当中?
stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...
- java之接口interface
接口 1.多个无关的类可以实现同一个接口 2.一个类可以实现多个无关的接口 3.与继承关系类似,接口与实现类之间存在多态性 4.定义java类的语法格式 < modifier> class ...
- 【Java 基础篇】【第六课】接口interface
Java提供的这个interface的语法,目的就是将接口从类中剥离出来,构成独立的主体. 首先加入我们定义了这个杯子接口: interface Cup { void addWater(int w); ...
- TypeScript学习指南第二章--接口(Interface)
接口(Interface) TypeScript的核心机制之一在于它的类型检查系统(type-checker)只关注一个变量的"模型(shape)" 稍后我们去了解这个所谓的形状是 ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Java接口interface
Java接口interface 1.多个无关的类可以实现同一个接口. 2.一个类可以实现多个无关的接口. 3.与继承关系类似,接口与实现类之间存在多态性. 接口(interface)是抽象方法和常量值 ...
随机推荐
- POJ 2195 D - Going Home 费用流
D - Going HomeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vie ...
- delphi 如何知道 Treeview,Listview 当前最上面显示的节点
如何知道 Treeview,的节点是根节点 procedure TForm1.TreeView1ContextPopup(Sender: TObject; MousePos: TPoint ...
- js获取网络图片的宽和高
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 华为 真机当作测试机 打开log开关
拨号界面输入*#*#2846579#*#*进入测试模式,点击"pyojectmeu"-点击第三个-"后台设置"-进入了之后-点击第2个-"log设置& ...
- 给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i < j)并且j-i最大
题目:给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i <= j)并且j-i最大 ,若有多个这样的位置对,返回i最小的那一对. 最直接的想法就是对于每一个 i 从数 ...
- Fliptile
开关题 尺度法 Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3394 Accepted: ...
- oracle顺序控制语句goto、null和分页过程中输入输出存储、java程序的调用过程
顺序控制语句1 goto建议不要使用 declare i number:=; begin loop dbms_output.put_line(i); then goto end_loop; end i ...
- android的个人代码总结
1.关于一个动作的实现,在Activity中可以用实现一个接口的方式来实现,在实现代码时可用IF进行判断是那个要执行的动作: 2.在软件开发过程中,软件界面的布局也非常重要:还是要多看看:
- 管理Activity
开源中国摘取的代码,这个可以管理activity 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...
- obj 转为Json 时间格式自定义
var tb = evnWarningBll.GatWarning(); var timeFormat = new IsoDateTimeConverter(); ...