首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

为什么要用接口(从编程视角)

2013-11-29 
为什么要用接口(从编程角度)接口很好大家都知道,但好在哪里却不一定说得出来,至少说得不通俗,或只是人云亦

为什么要用接口(从编程角度)
接口很好大家都知道,但好在哪里却不一定说得出来,至少说得不通俗,或只是人云亦云。我现在所知道的接口好处有以下几点(从编程角度),但我想知道更多更深的好处以及适用场景,而不是为了接口而接口。
假设有一个接口
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多个类找吧。
[解决办法]
引用:
有很多问题,其实是为了答案而诞生的问题,很多人认为,学习知识就是搞清楚这些问题的答案。事实上这些问题一点用也没有。


我想追问下,

接口:
接口是不是一些用得很广的类。
大家在决解问题时可能要用这些类。 但是懒得去写,就去继承他算了。
但又不想现在就继承--因为现在继承代码变得复杂,而且不知用不用得到。
所以故意留个坑在那,等到用到再去继承他?
那个坑 就叫接口?

是这样理解吗?

[解决办法]
接口的使用并非总是从设计的角度来考虑。接口和C#其他语法现象一样,共同构成了C#整个语言体系。
------------------------------------------------
我当时回复的时候,并没有想C#中的接口。

我认为在设计领域中才能更好的体现接口的意义,并不只是计算机范畴。

在程序设计这个(设计领域)子集中,接口的意义要和语言相结合。

接口的意义在于 抽象、不拘细节

从而使同类事物在同一高度具有通用及可替代性。


关于解耦,并不是接口能解耦,而是抽象能解耦 接口只是手段

还有一点,如果两个事物有必然联系,那么就不会出现完全解耦,只能耦合转移。

热点排行