接口(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)是抽象方法和常量值 ...
随机推荐
- VHD更新命令(打补丁)
DISM 查看vhd文件信息:dism /get-imageinfo /imagefile:e:\vhd\win2008r2.vhdxdism /get-imageinfo /imagefile:e: ...
- [Canvas] Make Canvas Responsive to Pixel Ratio
Canvas is great for high performance graphics rendering but by default the results look blocky on ph ...
- SQL SERVER NULL值和连接注意问题
联接表的列中的 null 值(如果有)互相不匹配.如果其中一个联接表的列中出现空值,只能通过外部联接返回这些空值(除非 WHERE 子句不包括空值). 下面的两个表中,每个表中要参与联接的列中均包 ...
- mmc线性0-1规划问题
本题目来自物理学苑,原作者认为mmc不容易解决0-1规划. 5个人选4个,组队游泳接力比赛,最好成绩组队. 其实,mmc解决此类问题,还是很方便,轻松的. 下面是原题目的求解:
- PHP设计模式之策略模式
前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...
- Logback日志使用详解
概述 Logback建立于三个主要类之上:日志记录器(Logger),输出端(Appender)和日志格式化器(Layout).这三种组件协同工作,使开发者可以按照消息类型和级别来记录消息,还可以在程 ...
- Redis 数据备份与恢复
Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 redis 127.0.0.1: ...
- 让 BAT 的 Offer 不再难拿
随着各大公司春招的开始,很多小伙伴都行动起来了,我有幸能够加入百度并和大家分享自己的经验心得.由于我面试的都是比较大的公司,所以自然也是做了这方面的准备,因此这篇总结并不一定适合想去创业公司的同学.另 ...
- TIANKENG’s rice shop
Problem Description TIANKENG managers a pan fried rice shop. There are n kinds of fried rice numbere ...
- Java SE ---算术运算符
算术运算符:(加)+,(减)-,(乘)*,(除)/,(求余)%,自增自减 一,算数运算符:当有若干个变量参与运算时,结果类型取决于这些变量中表示范围最大的那个变量类型.如果参加运算的变量中有整型int ...