面向接口编程详解

上传人:学**** 文档编号:301735797 上传时间:2022-05-31 格式:DOCX 页数:9 大小:20.50KB
返回 下载 相关 举报
面向接口编程详解_第1页
第1页 / 共9页
面向接口编程详解_第2页
第2页 / 共9页
面向接口编程详解_第3页
第3页 / 共9页
面向接口编程详解_第4页
第4页 / 共9页
面向接口编程详解_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《面向接口编程详解》由会员分享,可在线阅读,更多相关《面向接口编程详解(9页珍藏版)》请在金锄头文库上搜索。

1、本文格式为Word版,下载可任意编辑面向接口编程详解 面向接口编程详解(一)思想根基 我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词确定不目生,但是不知各位有没有这样的不解:接口有什么用途?它和抽象类有什么识别?能不能用抽象类代替接口呢?而且,作为程序员,确定经常听到“面向接口编程”这个短语,那么它是什么意思?有什么思想内涵?和面向对象编程是什么关系?本文将一一解答这些疑问。 1.面向接口编程和面向对象编程是什么关系 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一片面。或者说,它是面向对象编

2、程体系中的思想精华之一。 2.接口的本质 接口,在外观上是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口所实现(或者也可以说继承)。它在形式上可能是如下的样子: interface InterfaceName void Method1(); void Method2(int para1); void Method3(string para2,string para3); 那么,接口的本质是什么呢?或者说接口存在的意义是什么。我认为可以从以下两个视角考虑: 1)接口是一组规矩的集合,它规定了实现本接口的类或接口务必拥有的一组规矩。表达了自然界“假设你是?那么务必能?”

3、的理念。 例如,在自然界中,人都能吃饭,即“假设你是人,那么务必能吃饭”。那么模拟到计算机程序中,就理应有一个IPerson(习惯上,接口名由“I”开头)接口,并有一个方法叫Eat(),然后我们规定,每一个表示“人”的类,务必实现IPerson接口,这就模拟了自然界“假设你是人,那么务必能吃饭”这条规矩。 从这里,我想各位也能看到些许面向对象思想的东西。面向对象思想的核心之一,就是模拟真实世界,把真实世界中的事物抽象成类,整个程序靠各个类的实例彼此通信、彼此协作完成系统功能,这分外符合真实世界的运行状况,也是面向对象思想的精华。 2)接口是在确定粒度视图上同类事物的抽象表示。留神这里我强调了在

4、确定粒度视图上,由于“同类事物”这个概念是相对的,它由于粒度视图不同而不同。 例如,在我的眼里,我是一个人,和一头猪有本质识别,我可以采纳我和我同学是同类这个说法,但绝不能采纳我和一头猪是同类。但是,假设在一个动物学家眼里,我和猪理应是同类,由于我们都是动物,他可以认为“人”和“猪”都实现了IAnimal这个接口,而他在研究动物行为时,不会把我和猪分开对待,而会从“动物”这个较大的粒度上研究,但他会认为我和一棵树有本质识别。 现在换了一个遗传学家,处境又不同了,由于生物都能遗传,所以在他眼里,我不仅和猪没识别,和一只蚊子、一个细菌、一颗树、一个蘑菇乃至一个SARS病毒都没什么识别,由于他会认为

5、我们都实现了IDescendable这个接口(注:descend vi. 遗传),即我们都是可遗传的东西,他不会分别研究我们,而会将全体生物作为同类举行研究,在他眼里没有人和病毒之分,只有可遗传的物质和不成遗传的物质。但至少,我和一块石头还是有识别的。 可不幸的事情发生了,某日,地球上展现了一位宏伟的人,他叫列宁,他在熟读马克思、恩格斯的辩证唯物主义思想巨著后,颇有心得,于是他下了一个出名的定义:所谓物质,就是能被意识所反映的客观实在。至此,我和一块石头、一丝空气、一条成语和传输手机信号的电磁场已经没什么识别了,由于在列宁的眼里,我们都是可以被意识所反映的客观实在。假设列宁是一名程序员,他会这

6、么说:所谓物质,就是全体同时实现了“IReflectabe”和“IEsse”两个接口的类所生成的实例。(注:reflect v. 反映 esse n. 客观实在) 可能你会觉得我上面的例子像在瞎掰,但是,这正是接口得以存在的意义。面向对 事物不加识别的对待而统一处理。而之所以敢这样做,就是由于有接口的存在。像那个遗传学家,他明白全体生物都实现了IDescendable接口,那只要是生物,确定有Descend()这个方法,于是他就可以统一研究,而不至于分别研究每一种生物而最终累死。 可能这里还不能给你一个关于接口本质和作用的直观印象。那么在后文的例子和对几个设计模式的解析中,你将会更直观体验到接

7、口的内涵。 3.面向接口编程综述 通过上文,我想大家对接口和接口的思想内涵有了一个了解,那么什么是面向接口编程呢?我个人的定义是:在系统分析和架构中,分清层次和凭借关系,每个层次不是直接向其上层供给服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口凭借,而不凭借概括类。 这样做的好处是显而易见的,首先对系统生动性大有好处。当下层需要变更时,只要接口及接口功能不变,那么上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉,就像我们将一个WD的60G硬盘换成一个希捷的160G的硬盘,计算机其他地方不用做任何改动,而是把原硬盘拔下来、新硬

8、盘插上就行了,由于计算机其他片面不凭借概括硬盘,而只凭借一个IDE接口,只要硬盘实现了这个接口,就可以替换上去。从这里看,程序中的接口和现实中的接口极为好像,所以我一向认为,接口(interface)这个词用的真是神似! 使用接口的另一个好处就是不同部件或层次的开发人员可以并行开工,就像造硬盘的不用等造CPU的,也不用等造显示器的,只要接口一致,设计合理,完全可以并行举行开发,从而提高效率。 本篇文章先到这里。结果我想再啰嗦一句:面向对象的精华是模拟现实,这也可以说是我这篇文章的灵魂。所以,多从现实中斟酌面向对象的东西,对提高系统分析设计才能大有脾益。 下篇文章,我将用一个实例来表示接口编程的

9、根本方法。 而第三篇,我将解析经典设计模式中的一些面向接口编程思想,并解析一下.NET分 对本文的补充: 留心看了各位的回复,分外欣喜能和大家一起议论技术问题。感谢给出断定的挚友,也要感谢提出观法和质疑的挚友,这促使我更深入斟酌一些东西,梦想能借此进步。在这里我想补充一些东西,以议论一些回复中对比集中的问题。 1.关于“面向接口编程”中的“接口”与概括面向对象语言中“接口”两个词 看到有挚友提出“面向接口编程”中的“接口”二字理应比单纯编程语言中的interface范围更大。我经过斟酌,觉得很有道理。这里我写确实实不太合理。我想,面向对象语言中的“接口”是指概括的一种代码布局,例如C#中用in

10、terface关键字定义的接口。而“面向接口编程”中的“接口”可以说是一种从软件架构的角度、从一个更抽象的层面上指那种用于暗藏概括底层类和实现多态性的布局部件。从这个意义上说,假设定义一个抽象类,并且目的是为了实现多态,那么我认为把这个抽象类也称为“接口”是合理的。但是用抽象类实现多态合理不合理?在下面其次条议论。 概括来说,我觉得两个“接口”的概念既相互识别又相互联系。“面向接口编程”中的接口是一种思想层面的用于实现多态性、提高软件生动性和可维护性的架构部件,而概括语言中的“接口”是将这种思想中的部件概括实施到代码里的手段。 2.关于抽象类与接口 看到回复中这是议论的对比强烈的一个问题。很歉

11、仄我考虑不周没有在文章中议论这个问题。我个人对这个问题的理解如下: 假设单从概括代码来看,对这两个概念很轻易模糊,甚至觉得接口就是多余的,由于单从概括功能来看,除多重继承外(C#,Java中),抽象类貌似完全能取代接口。但是,莫非接口的存在是为了实现多重继承?当然不是。我认为,抽象类和接口的识别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。所以,假设你在为某个地方该使用接口还是抽象类而踌躇不决时,那么可以想想你的动机是什么。 看到有挚友对IPerson这个接口的质疑,我个人的理解是,IPerson这个接口该不该 Women和Man,都继承Perso n,而且Wom

12、en和Man绝大多数方法都一致,只有一个方法DoSomethingInWC()不同(例子对比粗俗,各位见谅),那么当然定义一个AbstractPerson抽象类对比合理,由于它可以把其他全体方法都包含进去,子类只定义DoSomethingInWC(),大大裁减了重复代码量。 但是,假设我们程序中的Women和Man两个类根本没有共同代码,而且有一个PersonHandle类需要实例化他们,并且不梦想知道他们是男是女,而只需把他们当作人对付,并实现多态,那么定义成接口就有必要了。 总而言之,接口与抽象类的识别主要在于使用的动机,而不在于其本身。而一个东西该定义成抽象类还是接口,要根据概括环境的上

13、下文抉择。 再者,我认为接口和抽象类的另一个识别在于,抽象类和它的子类之间理应是一般和特殊的关系,而接口仅仅是它的子类理应实现的一组规矩。(当然,有时也可能存在一般与特殊的关系,但我们使用接口的目的不在这里)如,交通工具定义成抽象类,汽车、飞机、轮船定义成子类,是可以采纳的,由于汽车、飞机、轮船都是一种特殊的交通工具。再譬如Icomparable接口,它只是说,实现这个接口的类务必要可以举行对比,这是一条规矩。假设Car这个类实现了Icomparable,只是说,我们的Car中有一个方法可以对两个Car的实例举行对比,可能是比哪辆车更贵,也可能比哪辆车更大,这都无所谓,但我们不能说“汽车是一种特殊的可以对比”,这在文法上都不通。 面向接口编程详解(二)编程实例 问题的提出 定义:现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备举行数据交换。 上下文(环境):已知要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备举行数据交换,并且以后可能会有新的第三方的移动存储设备,所以计算机务必有扩展性,能与目前未知而以后可能会展现的存储设备举行数据交换。 9

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号