举个简单的例子吧..现在你要开发有一个信息管理系统、要用Access来作为数据库。你速度很快1个星期完成。
领导忽然告诉你..再需要一个SQLServer数据库的高端版本;1周后,领导又告诉你再来个MySQL版本的吧..这样丰富点。哥们.你怎么办呢?..你最直接的应该是把你的涉及数据操作的逻辑代码...呼呼..全部改写。你是这样吧!
如果用到接口,你就很简单了。首先,定义逻辑操作接口。涉及数据操作的类继承该接口实现。在逻辑层调用的时候,你面对的是接口。直接声明接口,将操作对象直接转化成接口类型。这里用到了一个很简单的知识,多态!继承是实现多态的不二法门。数据实现了接口,那么就具备可接口的所有定义。
这是后,如果你换不同数据库的版本的时候,很简单了,只要把数据操作层的实现方法改动就可以了。你的逻辑代码部分不用变动,因为接口没有变动。你是对接口的编程。在团队合作的开发中,面向接口编程是非常多,它的应用也很多。知识在网络上也恨都,如果感觉很抽象的话,那就多看代码实例吧。
http://www.cnblogs.com/michaelxu/archive/2007/03/29/692021.html ,看看.
工业中的接口:
笔记本实现了多种标准接口:USB接口、视频输出接口、耳机接口、麦克风接口、网卡接口、网线接口、电源接口,遵守接口的好处不单单是可以使用市面上的通用配件,对于厂内自家生产的多种配件,也能实现兼容。
比如一种电源变压器就可以应用于多种型号的笔记本,而不需要专为每一款笔记本生产不同种类的电源。
那么你说继承的效果不也一样吗?
试想一下,假如我们现在要推出一款超薄的移动性笔记本,强调极致轻薄、无线上网功能。为了极限缩减尺寸,视频输出接口、麦克风接口、网线接口要被舍弃。
那么如果是使用继承的办法实现,那怎么弄?继承了好几个没有作用的接口,然后再封上?脱了裤子放屁嘛。
而接口模式就很简单了,不需要的接口只要不实现就行了呀。
接口一大重要特征就是“职责单一”,USB接口就负责USB设备的衔接,电源接口就负责电力输入,麦克风接口只能插麦克风,你不需要什么功能就不用实现它。
所以说接口是可选择的功能组合,而继承只能是全盘接收,在应对变化时,继承远不如接口灵活。
自然界中的接口:
达尔文进化论描绘的进化蓝图,就像是一棵继承树,各个物种继承前一个物种并加以变化,形成新的物种分支。
但最新的生物研究表明,这棵“树”并不是简单的多杈延伸形式,或者说它更像一只网,新物种的形成不仅仅是继承在发挥作用,还有组合的关系。
科学家们发现许多物种的DNA中都包含了很多其他物种的DNA片段,比如牛的DNA中就包括了果蝇和蛇的一部分DNA,人类DNA中包含了很多病毒的DNA,并且某些DNA还是某些功能所不可或缺的。
还有像幼体与成体不同的物种中,其DNA中就是有两种不同的物种DNA片段,可以说它变态前是一个物种,变态后又是另外一种,一个比较有代表意义的例子就是海星,海星的幼体变态为成体后,其附属物仍然可以作为一个单独的生命生活数天。
科学家认为这些基因的组合可能来源于杂交,而不是正常的繁衍,并且这应当是自然界多态进化的一种重要形式。
这种组合关系不是很像接口吗?
程序中的接口:
程序中的接口主要的作用就是进行功能的组合,使得同一对象能够被使用在多种地方,其重大优势就是应对变化。
为什么接口能够很好地应对变化呢?
就是因为其职责单一。
每只蚂蚁的职责是非常单一的,一块石头砸到蚁群中,死掉大半数量的蚂蚁,但蚁群仍然可以正常工作。
如果换做一只大虫子,一块石头砸坏头部、腹部、尾部,虫子不死也奄奄一息了,因为他是一个复杂的整体,各个器官相互依赖才能正常运作。
同样的,变化也会让你的程序部分失效,如果你是由接口组合而成的对象,则能够降低变化造成的损失,失效的接口直接舍弃,其他接口仍然还在继续工作。
另外,接口是一种更高程度的抽象。
初期我们写程序可能对抽象没有概念,纯粹使用数组什么的存储数据,进行操作。
后来我们发现面向对象能够更方便地控制,于是将各种现实中的事物都抽象、封装为类。
再往后你会发现各个类中也会有很多相似的东西,比如瓶子和锅都有盖,足球和轮胎都能打气,这样高度抽象出来的东西就是接口,足球和轮胎只要都实现“气嘴”接口,就都可以用打气筒对象打气。
反之试想一下,你如何用继承来描述足球和轮胎的关系呢?即使实现也会很蹩脚吧?
简单来说接口是一种约束,也就是必须遵守的规则。例如你说的
public interface IPrint()
{
void GetName();
string PrintString();
}
当你继承了这个接口时,就必须实现里面二个方法,少一个都不行。这样起到一个约束,一个事情必须走这二步才会完成,否则就会出现错误。
这样够简单了吧。。理解了没有?还没有的加我MSN:fenglang@live.hk,慢慢解释,慢慢磨。。