日期:2014-05-17  浏览次数:20434 次

为什么要用接口(从编程角度)
接口很好大家都知道,但好在哪里却不一定说得出来,至少说得不通俗,或只是人云亦云。我现在所知道的接口好处有以下几点(从编程角度),但我想知道更多更深的好处以及适用场景,而不是为了接口而接口。
假设有一个接口
interface IX
{
int GetMax(int a,bool b);
}

好处:
1.我可以通过往一个IList<IX>立面添加继承了IX接口的对象,然后用foreach(ix in LIST){ix.GetMax(1,true)};因为方法名相同,但如果没用接口我就不能这样调(例如某个类也有GetMax方法,但参数为3个)。
2.继承了IX接口的类,我就知道它具备GetMax方法,但如果没用接口,我必须去看看那个类的GetMax是否真的符合我的调用需求,甚至那个类可能根本就没有GetMax方法,但却有GetMaxValue方法,作用一样只是名字不一样。如果多人开发,用接口减少了很多沟通和解释。
3.修改接口继承类中的实现方法,调用者不需要修改代码。比如很多地方都用了ix.GetMax(1,true),修改具体接口实现类的方法,我调用的地方不用做修改。(但这里这样解释不准确,因为我如果不用接口,直接在类中改实现方法,只要参数返回值相同,也不用修改调用的地方,请高手说明)
4.可以通过工厂和反射来创建具体的继承IX的实现类,调用者甚至都不知道具体最终调的是哪个实现类的方法。修改实现类的时候,对于调用者做到真正透明。
5.一开始就针对应用定义出需要的接口方法,然后逐步细化,而不会遗漏,而不是一开始就建类,然后不断的补方法,最后弄得这个类很臃肿。
6.多人开发时,我负责A模块开发,要调用GetMax方法,一开始就可以写,尽管负责写GetMax方法的人还没真的写出具体的方法来。但如果不用接口,我要调他的方法,我还要先问他那个获取最大值的方法是不是叫GetMax,是不是返回int,等。
7.在多继承时,接口提供了灵活的机制,我没必要为了统一一个GetMax的方法,就去搞一个抽象类A,万一将来又想统一一个GetName方法,又在抽象类A中加GetName方法?这显然不合理,因为GetName可能更GetMax可能都不是一个范畴的东西,硬要拉在一起,破坏了类的单一职责。
8.接口看起来更简洁。

希望各位告诉我接口还有什么好处?请用具体的场景或代码说明,以上列举如有错也请指出。

------解决方案--------------------
针对接口编程可以实现解耦合,也是设计模式中广泛采用的设计方式。
------解决方案--------------------
接口这种概念是形而上的,是编程语言无关的...跟什么工厂、反射、类、方法更是一毛钱关系都没有,这些枝末细节只是可以为接口服务而已...
------解决方案--------------------
并行开发
测试方便
解耦合
------解决方案--------------------
引用:
引用:
并行开发
测试方便
解耦合

并行开发可以理解,我的例子中也有提到。但测试方便和解耦合,如何体现?


测试方便和解耦合

先不考虑用接口

写几个对象,然后一个对象依赖调用其他对象,

然后你用单元测试,测试该对象,因为其依赖对象的调用都硬编码在其对象内,很难测试

然后你考虑用依赖注入,如构造函数依赖注入,可以测试了

然后你发现这个对象很依赖于所依赖的对象的具体实现,如一个退款对象类里面,涉及到对支付代理商的对象依赖,今天我要用PayPal,明天要用支付宝,因为退款对象和其他依赖对象耦合太紧密,要修改代理商,只能去直接修改退款对象,将所涉及的支付的几个行为作为签约定义到一个接口里面,退款对象依赖于该接口

那单元测试的时候,你 IPayGateway payGateway = new PayPal(); 和 IPayGateway payGateway = new Alipay(); 对测试没影响了,进一步解耦可以考虑 IOC及IOC容器概念

依赖注入只是IOC的一种实现
------解决方案--------------------
引用:
引用:
引用:
并行开发
测试方便
解耦合

并行开发可以理解,我的例子中也有提到。但测试方便和解耦合,如何体现?


测试方便和解耦合

先不考虑用接口

写几个对象,然后一个对象依赖调用其他对象,

然后你用单元测试,测试该对象,因为其依赖对象的调用都硬编码在其对象内,很难测试

……

签约 =》 契约
------解决方案--------------------
理论看多了,可以参考下面接口相关的小例子:
http://www.cnblogs.com/insus/category/308317.html
http://www.cnblogs.com/insus/category/225730.html
------解决方案--------------------
楼主你说 插头接口有什么用呢?

1,开发角度:
先规定接口 然后不同的生产商 按照这个标准生产就ok了。。
如果没有这个 接口每个人做每个人 到时候怎么连接在一起呢。

2,测试角度
首先检测接口 然后检查接口实现就好了,但你如果没有这个接口的话 N多个类找吧。
------解决方案--------------------
引用:
有很多问题,其实是为了答案而诞生的问题,很多人认为,学习知识就是搞清楚这些问题的答案。事实上这些问题一点用也没有。


我想追问下,

接口:
接口是不是一些用得很广的类。
大家在决解问题时可能要用这些类。 但是懒得去写,就去继承他算了。