请教:始终不明白“接口”是怎么一个概念?有什么用处?怎么用?(100分)

  • 主题发起人 主题发起人 yijin
  • 开始时间 开始时间
http://www.delphibbs.com/delphibbs/dispq.asp?lid=596317
 
接口
1.接口是一个对象在对其它的对象进行调用时所知道的方法集合。
2.一个对象可以有多个接口(实际上,接口是对象所有方法的一个子集)
3.类型是对象的一个特定的接口。
4.不同的对象可以具有相同的类型,而且一个对象可以具有多个不同的类型。
5.一个对象仅能通过其接口才会被其它对象所了解。
6.某种意义上,接口是以一种非常局限的方式,将"是一种…"表达为"一种支持该接口的…"。
7.接口是实现插件化(pluggability)的关键


实现继承和接口继承

1.实现继承(类继承):一个对象的实现是根据另一个对象的实现来定义的。
2.接口继承(子类型化):描述了一个对象可在什么时候被用来替代另一个对象。
3.C++的继承机制既指类继承,又指接口继承。
4.C++通过继承纯虚类来实现接口继承。
5.Java对接口继承具有单独的语言构造方式-Java接口。
6.Java接口构造方式更加易于表达和实现那些专注于对象接口的设计。
接口的好处



1.优点:
a.Client不必知道其使用对象的具体所属类。
b.一个对象可以很容易地被(实现了相同接口的)的另一个对象所替换。
c.对象间的连接不必硬绑定(hardwire)到一个具体类的对象上,因此增加了灵活性。
e.松散藕合(loosens coupling)。
f.增加了重用的可能性。
e.提高了(对象)组合的机率,因为被包含对象可以是任何实现了一个指定接口的类。
2.缺点:
a.设计的复杂性略有增加
(译者注:接口表示"…像…"(LikeA)的关系,继承表示"…是…"(IsA)的关系,组合表示"…有…"(HasA)的关系。)

------引自别人的贴子 很形象
一个理解JAVA接口的很形象的比喻
  可以把接口理解为一个严格定义的抽象类,因为它和抽象类一样都含有未被定义的方
法。除次之外,接口内所有变量都必须是常数,也就是说这些变量都必须同时使用public
static final这3个修饰词。
         接口                抽象类
变量      必须同时使用public static final 没有限制
方法(函数)  所有方法只能被声名而不能被定义    至少有一个方法只能被声名
                           而不能被定义 
注意:接口允许多重继承!!!
例如:
public interface 儿子 extends 爸爸,妈妈,爷爷,奶奶

//这就是多重继承

一个理解JAVA接口的很形象的比喻:
类 爷爷

  聪明

类 奶奶

  谦虚

类 爸爸

  幽默

类 妈妈

  善良

class 小明 extends 爸爸
{
幽默

小明还想继承爷爷,奶奶和妈妈的优点,怎么办???
建一个接口--遗传
interface 遗传

  聪明
  谦虚
  善良

class 小明 extends 爸爸 implements 遗传

//完美的小明

 
接口代表的是一群服务的“定义”,当我们使用delphi的可视化Type Library编辑器或其它的方式定义了接口以后,还必须以object pascal实现接口定义服务的实际程序代码。此外,接口代表了这个COM/DCOM对象和所有使用它的客户端之间的“合约”。这是指一旦COM/DCOM对象定义了一个接口和它提供的服务后,那么COM/DCOM对象便不可以再改变接口的定义,所有客户端的用户都可以根据接口向这个COM/DCOM对象取得服务,客户端不必担心日后无法再以相同的方式来使用COM/DCOM对象已经定义的接口。
如果从实现技术的角度来看接口,那么可说接口只是一个内存区块。在这个内存区块中记载了所有可以由这个接口调用的方法。
简单的说不妨认为接口就是一组功能相近的方法过程的集合。
 
接口就是要求不同的计算机软件程序,或分布在网骆上不同的机器这间软件也可以相互通信;接口是能过一组函数而链接起来的,这组函数实际上就定义了程序中不同部分的接口;
如:
Dll的接口就是它所输出的那些函数,类的接口中央电视台是该类的一个成员函数集,然而,COM接口与Dll或对像Pascal类的接口不同,COM中的接口也涉及到一组由组件实现并提供给函数;对于COM来说,接口是一个包含指针数组的内存结构,每一个数组无素是一个由组件所实现 的函数的地址;对于COM而言,接口就是此内存结构,其它东西均是一个COM并不关心的实现细节;
接口,无论是那种接口,自定义的也好,IUnKnown也好,或是和COM无关的Interface接口也好,它们都遵循定义、实现、引用;
 
接口
jiēkǒu
[take up sb.'s remark]∶接着别人的话[说]
妈妈的话一落音,她就接口谈了起来
[interface;joint]∶两个物体的口子相连接
这里正是新沟跟旧沟的接口的地方
接口
jiēkǒu
[interface]∶两个不同系统(或子程序)交接并通过它彼此作用的部分
[joggle]∶稍带台阶形的形成金属平板的壁阶(如为了提供法兰盘)
 
也不是蛮明白接口,但是有一点:
它没有实例,给人的感觉就象一个指针接口:
如:Enumeration接口和Vector的elements方法的连接:
Enumeration e = v.elements();
下一步就可以使用 e 的方法对 v 的内容进行操作了,
 
哈哈,接口是一种思想!你甚至可以把所有的交互方式都看成是接口,它太普遍了!
 
接口的定义我就不说啊。 我说说接口的现实意义吧。
1. 从需求上来说:接口体显了你需求分析的结果。它是需求分析后的产物。你在做完需求分析后,完全可以得到一个系统各部所需要的方法。记住,它只反应了系统想要做些什么,而不是系统该怎么做。当你认为你所定义的接口完全满足了需求中的全部功能时,最好通过手工的方式模拟系统的运行。
举个例子,你可以一边看着你的用例图和序列图(不仅仅是这些),一边“调用”你的接口中的方法。这个调用是指在你的头脑中调用。你就直接假设所有的实现都已经完成,并且非常正确。
如果在你的头脑中系统“运行”的很好。说明你完成了系统上层的设计工作(前提是你的需求是正确的)。接下来你可以针对你所设计的接口做应对于“在接口所定义的方法下不同需求的不同的实现”来实现对相同的业务不同的业务规责的多态性。记住接口是实现多态性的机制(当然,抽象类也可以)。
2. 从设计角度来分析:java提倡的是针对抽象编程(其实只要是面向对象的语言都应如此)。具体的意思就是客户端应该只依赖于抽象的东西。再具体一点来说,就是说白了,客户端应该只针对接口来编程。不要针对具体的实现,这样当实现这个接口的业务规则发生了变化,你只需要改动后面的实现,而不影响客户端,因为客户端根本不知道你已经“偷偷地”改变了方法的具体实现。这使得系统一处发生了变化,对系统的影响范围减至最少。顺便说一下“客户端”的概念,客户端不是用户端。客户端是相对的,A 调用了 B ,A就叫做B的客户端,B是A的服务端.一般来讲,一个系统中,上层是下一层的客户端。下一层是上一层的服务端。一个系统的各部分可能相互调用,那它们之间也是客户端和服务端的关系。服务端只提供给客户端必要的方法。当系统各部分之间针对于抽象(具体就是通过接口),来相互调用的话,各部分之间就有了一个稳定的“契约”,它们都以这个契约为准相互沟通,而彼此都不知道对方是如何实现的。这样的话,你就有很大的余地来选择每部分的具体实现细节,怎么实现。从而一点都不影响它们的客户端。这种情况在实现规则发生改变你需要重写实现时体现的最为明显。这也是针对抽象编程的原因。
3. 从面向对象的角度看:面向对象技术为我们提供了许多好的特征。比如:信息隐藏,多态。实现信息隐藏的手段是封装,而实现多态的手段就是继承。(接口的实现可以看做是一种继承,虽然它没有从“父亲”那里继承任何东西,但它还是你的父亲 ^_^)。运用接口我们可以充份运用多态的特性。要知道,多态是面向对象中最为重要的特性之一。如果你不用接口或抽象类,而只是直接用每个具体的类做事情,那可以说你大概从面向对象这里仅仅取得了一点封装信息的好处,而失去了多态这个最大的好处。这样的程序并不是真正运用了面向对象的技术。所以用面向对象,最主要的就是在用它的多态性质。而使用接口正是通往多态大道。
以上是我从我的经验中总结的一点个人意见。大家继续讨论一下。

我再写一个例子体显一下接口带来的多态性吧:
//这是一个接口,Vehicle是交通工具的意思,这个接口定义了交通工具的一个共有的方法
//drive()驾驶
public interface InfVehicle {
public void drive();
}
//小汽车是交通工具,实现交通工具的接口
public class Car implements InfVehicle {
public void drive() {
//这里具体实现小汽车的驾驶方法
}
}
//自行车也是交通工具,实现了交通工具的接口
public class Bicycle implements InfVehicle {
public void drive() {
//这里具体实现自行车的驾驶方法
}
}
//这是一个“人”类,它有一个方法是 goHome回家,回家需要一种交通工具,所以他有一个交通工具,他回家时使用这个工具
public class Man {
private InfVehicle vehicle;

public InfVehicle getVehicle() {
return this.vehicle;
}
public void setVehicle(InfVehicle vehicle) {
this.vehicle = vehicle;
}
//回家方法
public void goHome() {
this.vehicle.drive();
}
}
现在我们来看怎么使用这些类
Man aMan = new Man();
//创建一个"人"
InfVehicle car = new Car();
//创建一个小汽车
InfVehicle bicycle = new Bicycle();//创建一个自行车
//比如今天这个人想开车回家,我们就
aMan.setVehicle(car);
aMan.goHome();
//如果他开车开腻了,想换一种方式,他这可以骑车回家
aMan.setVehicle(bicycle);
aMan.goHome();
 
类 爷爷

  聪明

这个聪明是属性还是方法?
 
可以是属性当然也可以是方法
 
多人接受答案了。
 
后退
顶部