3、接口详解

转载请注明出处 --爱技术的华仔(http://blog.csdn.net/yunhua_lee)

接口”是我见过的面向对象领域中滥用、乱用、误用最多的术语

有的人说:兄弟,给我提供一个“查询XXX”的接口。。。。。。

有的人说:系统对外提供了“查询”、“插入”、“更新”、“删除”4个接口。。。。。。

有的人说:我们要基于“接口”编程。。。。。。

有的人说:你这样做破坏了我们的接口设计。。。。。。

。。。。。。。。。。。

倒不是在这里指责他们的水平有多差,而是接口这个属于的中文翻译确实难以理解。

台湾译为介面,仲介之面的意思;大陆译作界面,也译作接口,但无论是“界面”、“介面”、“仲介之面”还是“接口”,都远远没有“类”、“对象”那么直白和容易理解。

既然中文很难理解,那么我们从英文入手,看看是否会有什么新的发现。

“接口”英文为“interface”,按照英文的方法将其拆开,其实就是“inter – face”,也就是说其包含两层意思:

【Inter】: 互相,与互相对应的是单个、多个,为什么这里要强调2个呢?

首先,“单个”不存在交互,你自己玩自己的,别人管不了,也就没法交互了;

其次,“多个”交互就混乱了,比如说,假设一个USB接口能够同时接鼠标和键盘,那么怎么知道收到的信号时谁发出的,发出的信号又是要发给谁呢?

【Face】:面,与面对应的是点、线,这里为什么要强调“面”呢?

首先,“面”很形象,围着你的电脑看一下,USB接口、网络接口、VGA接口,形状是不是都是“面”?

其次,“面”体现了功能的多样性。即:接口包含多个“功能点”,例如:USB接口有输入功能、输出功能、充电功能,这三个功能都是USB接口具备的,而不是三个接口。

基于上述分析,我们可以给接口下一个清晰和容易理解的定义:接口是一组相关的交互功能点定义的集合。

这个定义的三个关键点详细解析一下:

【相关】

接口中包含的功能点是相关的,而不是一堆无关功能的堆砌。

例如USB接口,你见过既支持USB协议、又支持VGA协议、还支持PS/2的接口么?

【交互】

接口是用于不同物体交互,如果只是自己玩,那么就不能成为接口;

【定义】

接口中的功能点只是定义,并不涉及具体实现。

也就是说,接口是一个交互协议,是交互双方的一个约定,但具体如何实现,由具体的交互实体各自实现即可。

就像USB接口,张三可以接鼠标、李四可以接键盘、王五可以接散热风扇,但无论是鼠标、键盘还是风扇,都必须遵循USB接口的协议标准。

【集合】

接口是多个功能点的集合,而不是一个具体的功能点。

但如果你说要我重新将interface翻译成简单易理解的中文,恕我才能不够,我也没法翻译。

回过头来看本章前面提到的关于接口的不同说法:

有的人说:兄弟,给我提供一个“查询XXX”的接口——这里说的是一个功能

有的人说:系统对外提供了“查询”、“插入”、“更新”、“删除”4个接口——这里说的是多个功能,这些功能合起来才是一个完整的接口

有的人说:我们要基于“接口”编程——这个符合接口的定义

有的人说:你这样做破坏了我们的接口设计——这个可能符合接口的定义,也可能不符合,关键看这里的接口是指某个功能还是一组功能。

Java语言中的接口很好的展现了接口的含义:IAnimal.java

 1 package com.oo.demo;
 2
 3 public interface IAnimal {
 4
 5     /*
 6      * Java的Interface很好的体现了我们前面分析的接口的特征:
 7      * 1)是一组功能的集合,而不是一个功能
 8      * 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作
 9      * 3)接口只定义函数,但不涉及函数实现
10      * 4)这些功能是相关的,都是动物相关的功能,但光合作用就不适宜放到IAnimal里面了
11      */
12     public void eat();
13     public void run();
14     public void sleep();
15     public void speak();
16 }  

Pig.java

 1 package com.oo.demo;
 2 /**
 3  * “猪”的类设计,实现了IAnnimal接口
 4  *
 5  */
 6 public class Pig implements IAnimal{
 7
 8     //如下每个函数都需要详细实现
 9     public void eat(){
10
11         System.out.println("Pig like to eat grass");
12     }
13
14     public void run(){
15
16         System.out.println("Pig run: front legs, back legs");
17     }
18
19     public void sleep(){
20
21         System.out.println("Pig sleep 16 hours every day");
22     }
23
24     public void speak(){
25
26         System.out.println("Pig can not speak");
27     }
28 }  

Person2.java

 1 package com.oo.demo;
 2 /**
 3  * 实现了IAnimal的“人”,有几点说明一下:
 4  * 1)同样都实现了IAnimal的接口,但“人”和“猪”的实现不一样,
 5  *    为了避免太多代码导致影响阅读,这里的代码简化成一行,但输出的内容不一样,
 6  *    实际项目中同一接口的同一功能点,不同的类实现完全不一样
 7  * 2)这里同样是“人”这个类,但和前面介绍类时给的类“Person”完全不一样,
 8  *    这是因为同样的逻辑概念,在不同的应用场景下,具备的属性和功能是完全不一样的
 9  *
10  */
11 public class Person2 implements IAnimal {
12
13     public void eat(){
14
15         System.out.println("Person like to eat meat");
16     }
17
18     public void run(){
19
20         System.out.println("Person run: left leg, right leg");
21     }
22
23     public void sleep(){
24
25         System.out.println("Person sleep 8 hours every dat");
26     }
27
28     @Override
29     public void speak(){
30
31         System.out.println("Hellow world, I am a person");
32     }
33
34 }  

Tester03.java

 1 package com.oo.demo;
 2 /**
 3  * @author liyunhua
 4  *
 5  */
 6 public class Tester03 {
 7
 8     public static void main(String[] args) {
 9
10         System.out.println("===This is a person===");
11         IAnimal person = new Person2();
12         person.eat();
13         person.run();
14         person.sleep();
15         person.speak();
16
17         System.out.println("\n===This is a pig===");
18         IAnimal pig = new Pig();
19         pig.eat();
20         pig.run();
21         pig.sleep();
22         pig.speak();
23
24     }
25
26 }  

有了类之后为什么还要有接口呢?我直接用类不行么?

例如,我想操作人的时候就用Person,我想操作猪的时候就用Pig

大部分情况下这样做是可以的,但有的时候,你可能并不知道你面对的是一个人还是一头猪,因为这个动物可能是别人创建的,或者是上帝创建的。你只知道这是个动物,但你又希望这个动物按照你的要求进行活动。这就是接口的用处所在,即:你不知道一个对象所属的具体“类”,只知道这些对象都具备某种功能。

时间: 2024-10-12 21:07:28

3、接口详解的相关文章

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频

Java6.0中Comparable接口与Comparator接口详解

Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者都吃饱撑着没事做吗? 再谈Comparator接口之前,大家应该先了解一个叫“策略模式”的东东.一下是百度百科对策略模式的描写: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern

Android Environment类的接口详解

Android应用开发中,常使用Environment类去获取外部存储目录,在访问外部存储之前一定要先判断外部存储是否已经是可使用(已挂载&可使用)状态, 并且需要在AndroidManifest.xml文件中添加外部存储读和写的权限. Environment类中提供了几个静态常量用于标识外部存储的状态,这些状态都是String类型 MEDIA_BAD_REMOVAL 在没有挂载前存储媒体已经被移除. MEDIA_CHECKING 正在检查存储媒体. MEDIA_MOUNTED 存储媒体已经挂载

JDBC常用接口详解

JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 一.查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象. 二.程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦. 第二种方式:Class.forName("com.mysql.

嵌入式开发平台 迅为6818开发板接口详解

迅为八核iTOP-6818开发板接口详解: iTOP-4418接口图: iTOP-6818核心板: iTOP-6818开发板接口详解: 1.POWER电源接口 电源输入为5V/2A+,给核心板AXP228电源管理芯片提供5V电源,给底板供电. 2. SWITCH电源开关 轻触电源开关可以控制开发板电源通断. 3. 拨码开关 3位拨码开关控制4418启动模式. 4. 模数转换 A/D模数转换,调整滑动变阻器,模拟量可以通过转换口检测到. 5. JTAG接口 保留JTAG接口,有需要的用户可以进行扩

IDisposable接口详解

IDisposable接口详解 1. MSDN中关于这个接口的说明 [ComVisible(true)] public interface IDisposable {     // Methods     void Dispose(); } [ComVisible(true)]:指示该托管类型对 COM 是可见的.此接口的主要用途是释放非托管资源.当不再使用托管对象时,垃圾回收器会自动释放分配给该对象的内存.但无法预测进行垃圾回收的时间.另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无

S?D?I?与?A?S?I 接口详解介绍

分量编码 在对彩色电视信号进行数字化处理和传输是,一种常用的方式是分别对其3个分量(Y,R-Y,B-Y)进行数字化编码.这就是分量分量编码,另外还有全信号编码,全信号编码是对彩色全电视信号直接进行编码形成数字视频信号.它的抽样频率一般采用fs=4fsc,这样对NTSC制和PAL制信号形成便于进行行间,场间,帧间的信号的正交抽样结构. 1. 抽样频率 当亮度信号Y的带宽为5.8MHz~6MHz,两个色差信号(R-Y)和(B-Y)的带宽均为2MHz是,可以获得满意的带宽. 2. 电视演播室分量编码国

基础拾忆------接口详解

目录: 基础拾忆------接口详解 基础拾忆------泛型详解 前言 接口定义了所有类继承接口时应遵循的契约.接口定义了 "要什么" ,派生类定义了 "怎么给" . 引用CLR VIA C#(类和接口继承) 在Microsoft.Net Framwork中,有一个名为System.Object的类,它定义了4个公共实例方法:ToString, Equals, GetHashCode和GetType.该类是其他所有类的根或者说最终基类.换言之,所有类都继承了Obj

“全栈2019”Java第八十三章:内部类与接口详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八十三章:内部类与接口详解 下一章 "全栈2019"Java第八十四章:接口中嵌套接口详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组&quo

抽象类及接口详解

一.前言 在上一节中我们讲到抽象类和接口之间的异同,我们一起回顾下其异同. 同: 1.都不可以被实例化 2.都含有声明但未实现的方法 3.都可以被继承 4.其子类必须实现其声明未实现的方法 异: 1.抽象类是多继承,接口是单继承 2.抽象类可以包含实现的方法,接口不能包含实现的方法 3.接口支持回调,抽象类不支持 4.抽象类更多的定义在一些类关系紧密的类间,接口则定义在实现其某一种功能之间 抽象类和接口的异同我们再次熟悉了一遍,今天我们主要讲的是抽象类和接口使用场景及详讲抽象类的使用方法及接口的