看了PetShop4.0的源码,里面有不少使用接口的例子,在可扩展性、减少耦合等方面似乎作用并不大,那为什么还要使用接口,直接定义使用类方便不少。大家对此有什么看法呢?
解决方案 »
- 数据处理后如何返回查询页面
- 问下.net,session跨域的问题
- 各位大仙,3天没弄出来啊!给GridView控件模板中的子空间DropDownList赋值
- asp.net中RadioButtonList相关问题
- 生成xls乱码的问题,很奇怪啊。
- 邮件发送问题(在线=)
- XHTML页面转到VS2003里面代码被改
- 如何实现datagrid按钮对datagrid中的内容进行编辑~没人回答+30分!两贴50分
- 已按步骤安装,为何会出错???
- MailMessage发送邮件,不出错,可是却收不到邮件?为什么呢?
- ASP.NET(VB.NET) 日历生成 急~ 【【 顶 】】
- [馨郁星愿]关于触发的话题
主要是针对以后的数据库平台转移便利。sql2000的数据库平台,都要实现该接口。
oiracle的也要实现该接口。而BLL层只要通过工厂模式调用方法,返回一个接口。就可以操作了。而不用管数据库的变迁。
1)提供了一个调用约定及抽象,相关开发人员可以根据实际情况“分头”实现
2)方便扩展,只需根据接口实现并通过相关机制“注册”或“载入”就可以。
...如果你不在乎系统将来可能面对的各种变化,也不在乎彼此之间有一个无关于实现的接口约定,那接口确实是没什么意义。欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/
我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。
主要是针对以后的数据库平台转移便利。sql2000的数据库平台,都要实现该接口。
oiracle的也要实现该接口。而BLL层只要通过工厂模式调用方法,返回一个接口。就可以操作了。而不用管数据库的变迁。
“你可以把类中变化的部分分离出来,放到接口里,然后用不同的类实现这些变化的方法
在大类中你可以引用这些接口,然后实例不同的方法.挺好”实际上也是这种说法的一个诠释。至于“接口更偏向约定一些,而无关于实现”和是否就等于“接口完全和实现无关”。我觉得二者都是在特定上下文中讲的话,一个偏向于强调其结构及意义,一个偏向于最重的部署和实现。其正确与否并不矛盾,而且说实话偏题太远了也过于琐碎了。我的中心思想还是那句话::“接口和抽象类各有各的作用。二者各有各的适用条件”。至于分别在何处何时适用,我也已经讲了很多。接口自然不是放到哪里都行,但也绝不是完全可被别人替代的毫无意义的替代品。
我的观点是:
interface能实现的,abstract类也能实现(假如有多重继承),而interface只是比abstract类更抽象。
我觉得关键是有不有地方确实需要这种仅仅只要方法声明,不需要任何实现的类型,我觉得是有的,并且很多。interface带来的便利本来就是设计上的,而不是功能上的。就好比假如没有抽象类,普通类一样可以完成抽象类的工作一样。
没有哪个地方只能用抽象类,而不能用普通类去替代。
呵呵,有时候“直接定义使用类方便不少”,我从来就不反对,也符合我的各有条件之说。但不总是如此,有的时候用接口能够明显的降低结构及代码的耦合度和维护成本,同时,提供较低成本的系统扩展方法。
好吧,不管我们俩今天的讨论从哪来开始的。周末了,今天的讨论就到此结束吧,大家周末愉快!
那不就对了吗,看看我们从哪里开始争论到现在。我从一开始就说“各有适用场合”,那你为什么还要和我争论呢? ^_^你自己都已经有了上述这番话,还有必要还要再举吗?但是既然你要,既然你觉得有必要,我也就再去找来贴一遍:1)==========================
何况,你的“分布式”说法本身就不成立。SOA算不算一种“新形势”下的分布式系统?很多人就把SOA看作“基于接口的设计”。因为SOA的核心确实就是将业务逻辑通过XML定义的接口合约明确下来。各服务之间完全基于这个合约进行整合和集成。SOA的例子恰恰说明了接口并不限于C#或者java的接口,而有其更普遍的意义。2)==========================
就拿我前面说的支付渠道的例子,当我把支付渠道德所有共性剥离出去,而抽象出独立的“支付渠道驱动接口”来建立平台有关支付渠道的扩展机制的时候,难道接口不是一种最直接的方式吗?直接了当的方式?难道我把今后不能预见的东西都实现了,或者一定要实现一些我想不到的功能,然后丢一个基类给别人去扩展,而且不但要解释扩展部分(其实类似于接口)的约定含义还要暴露不必要细节地解释已经有的属性和方法(除非全是私有,可如果已有属性和功能全都是私有,我为什么不通过一个虚基类也就是接口把它们封装起来,而把各接口实现这一有更大变化可能性的可变部分剥离出去以便降低维护成本呢)与其扩展部分之间的复杂关系才叫着接了当?3)===========================
比如在Ado.Net里定义的大量接口:IdbCommand、IDataReader、IColumnMapping、IColumnMappingCollection、IDataAdapter、IDataParameter、IDataParameterCollection 等等。IDBCommand当然不会是多余的,即便是允许多重继承也是如此。因为IDBCommand等接口的根本意义在于ADO.net提供了一个Provider(可能是第三方的)的统一“外表”,而不是什么“让其它同时具有多种接口的类型使用”。==========================至于“避免约束实现”我没说过,我的原话是“但也正因为其兼而有之,当我只想约定,而不想约束实现时,接口就是最好的选择。”其意义自己结合其上下文去看吧。至于你说的“abstract、sealed、virtual”这些东西对继承实现有没有影响本来是显而易见的:当我提供一个接口给别人的时候我只要把接口本身内部的关系解释清楚就可以了。当我用virtual的时候,我就必须让底层了解基类的实现逻辑大致是怎样的,何种条件下是应该被衍生类型替换的。这在有时候是没有办法改变的事情,但是在那些可以将一个类型其中的可变部分完全以接口形式确定下来而代价很小(比如根本不会或者很少产生代码冗余)的时候,我就可以把接口的实现通过接口与其它部分的实现清晰地“干净地”切割开来,从而在一个局部在很好地解决这种问题。
————————————————————————————————————————
使用接口就不需要“底层了解基类的实现逻辑大致是怎样的”的吗?这么说实现接口的类型随意实现接口,只要编译通过就行?提交被别人一个class的时候,为什么“只要把class本身内部的关系解释清楚”就不够呢?其实interface仅仅在“强迫程序员去自己写代码实现接口”这个方面与class不一样,在对程序员对协议的理解的说明方面没有任何区别。interface不实现内部程序,把这个说成是自己的优点(不需要了解实现),有class既可以继承也可以virtual,明明将实现方法隐藏了起来提供继承却被inetrface说成是“硬要程序了解实现内容”。
你的说法我在XingChen的书上似乎见过,似乎是抄来的。总的来说,我觉得他的那本书是很好的,很难的地,搞框架设计的人都应该读一读作为入门。但是他竟然把继承用这样做比喻:“父亲把遗产给了儿子”!这显然是乱伦的比喻。继承是说父子都是“同一个”实体,例如医院病人张三就是住院部病人张三,是同一个人,这才是继承。他的书设计模式很多,但是OO很少。
呵呵,好了,这个问题说了够多了,翻来覆去也讲了很多。请楼主择吉结贴吧。问题的答案大家自己去判断,我也不再回帖了。各位周末愉快,回家了。
所以说接口和继承是两个概念。接口是鸭子类型的蹩脚实现。
什么是鸭子类型,鸭子类型可以这样描述,如果一个东西叫声象鸭子,走路像鸭子,长得也像鸭子,那它就是鸭子。放到类上,一个类型如果具备某个抽象类型所有的公开接口,那它就应该是那个抽象类型。可以执行SQL命令的类就应该是IDbCommand,但是C#严谨的语法要求必须显示的声明一下,这就是接口了。
> 接口某种意义上就是一个Contract,是将来与现在的合约,是平台与应用的合约,是开发小组与开发小组的合约,而跟实现无关。客气了,接口就是 Contract,是更抽象的层次——等同于纯抽象类,只不过因为C#/Java等不支持多重继承的情况下,用接口来代替了纯抽象类>sp1234(3+1=无穷大)
“IDBCommand 接口之外还要提供 DBCommand 类型?为什么不把这个责任推卸给每一个程序员自己去实现?”此言差矣,你可以“实现”接口,却不能继承接口——正是因为接口等同于纯抽象类,它们俩都不能提供复用代码的好处,所以在某些情况下,包括你说到的分布式系统或者 aafshzj(上海北京) 举的例子以及 DBCommand 来看,接口配合抽象类的使用来完成这一工作:即提供抽象约定,又提供代码复用——前者由接口/纯抽象类负责,后者由抽象类/类负责。
那么,如果你不需要提供更高层次的抽象,那就没必要使用接口,抽象类/类就够了。抽象类和接口的差别以及何时使用的问题,可以从极端情况来看:
1、比较 接口 与 纯抽象类——可以得知,它们在继承层次上是最高级别,不同的地方在于语言是否允许多重继承——允许,那就没有区别了
2、如果想在约定(定义抽象约束)的同时提供代码复用,因为接口没有实现代码不支持继承,此时应该用类,甚至是抽象类,但肯定不是纯抽象类至于,接口是结构化的,与 oo 无关——这样的概念似乎不正确吧
对于一个“学生”类,可能实现了 IMan 接口,实现了 IStudent 接口,哪怕接口中什么也没有定义,那么这样的接口难道不是用来表达 is 关系的么?这难道不是 OO ?我同意你的观点,接口的引入的确是为了弥补不能多重继承的“不足”。但我不认为这是“不足”——java/C# 这么设计,恰恰是取了接口的好处,避免了多重继承的麻烦
你可以保留意见认为多重继承就是比采用接口的方案好但事实上,对于多重继承的依赖,恰恰体现了对于“复用”的依赖,甚至可能滥用。
使用接口,恰恰在很大程度上让我们的设计思路回归到设计本身,而不是代码复用。所以,有位朋友说得好:接口用来做设计,类用来复用代码——大概意思,不记得了,呵呵