锁定老帖子 主题:请教:关于接口的设计
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2005-09-09
redlly 写道 孤魂一笑 写道 jaqwolf 写道 如果没有List这个接口,那很多返回类型应该是ArrayList,Vector,LinkedList.但大部分人一般返回类型为List或者Collection 这是有道理的。 能说说吗? 我并没有从心里接受使用interface设计的必要性,java中interface的存在似乎是解决了不能继承多个父类。还有一个好处是,让oo的概念在java上体现的更清晰了,但是用起来麻烦啊--改得多,比如,我要重命名一个接口,既要改动inteface又要改动class。 我并非说不使用,而是想知道如何合理使用。 另外,即便是返回一个ArrayList 又有什么不好呢? 我说一种情况吧,有如下一个方法 public Vector getUsers(){ } 你使用Vector 作为容器保存用户列表,后面你发现,你使用 public ArrayList getUsrs(){ } 可能更好,因为不需要线程同步,而且ArrayList 的效率比Vector高, 如果你一开始就使用下面的方法 public List getUsrs(){ } 那么改动的就只是你写的这个方法,对调用这个方法的代码是不需要修改的。 因为我的返回类型是List ,至于是ArrayList ,LinkedList,Vector,甚至是jakarta commons collection的某些类,对外我是没有声明的。在这种情况下你认为返回ArrayList 好还是返回List好呢? 如果List不是接口,是个抽象类,ArrayList等都是继承它的,不是一样能达到你说的效果?! 别忘了 只能单继承. 如我们做系统中 会用到很多字典对像。 这时我会对所有的字典对象都现实一个共性的接口 然后拿着这接口通行天下 呵呵. |
|
返回顶楼 | |
发表时间:2005-09-09
接口,我认为是相对于类(CLASS)更加灵活的一种分类表示。
接口相对于类只提供对象类型的外部契约,而类还提供乐一个该契约的实现。 类型可以看作由一个契约和契约实现组成,接口和类则是对类型需求的不同程度的实现, 在分析和设计阶段,可以统一使用“类型”概念来描述具体对象, 而实现阶段可以根据具体的编程语言使用合适的“类型”实现(接口或者类)进行编码。 凡事都是具有两面性的,接口提供更高的类型灵活性,但是同时会增加复杂度,因此,在必要的时候从类抽象接口应该是相对合理的,因为类其实也是一种接口。 |
|
返回顶楼 | |
发表时间:2005-10-10
依我看来,只有设计时比较稳定不变的东西,才设计成接口,而每个接口都代表了
一类可能发生的变化。接口提供了架构的稳定性。接口改动带来的代价是很大的, 一般不会直接修改接口,而是增加新的接口,同时保留老的接口。新老接口可以用Adapter类来拾配 |
|
返回顶楼 | |
发表时间:2005-10-13
jbaggio 写道 调用接口和调用类的公用方法,有什么太大的区别吗?
这是肯定的。接口中的公用方法是多态的,可配置的,这取决于它多个 的实现者。类的公用方法是静态的,缺少灵活性。 robbin 写道 我比较习惯于先定义接口,然后写一个抽象类类实现通用的操作,专用的操作定义为抽象方法,强制继承类实现。这样一般的类就直接继承该抽象类,然后比较特殊的地方实现抽象方法。非常特殊的类就直接实现接口。
我觉得这样用很方便的。 同意老大的观点! 继承(实现继承和接口继承)是面向对象特有的复用特性,实现继承也是最容易被滥用的特性, 过多的超类继承破坏包装,因为继承将超类的实现细节暴露给子类。即使子类是透明的复用超类的内部细节,从超类继承的实现没有足够的灵活性,因为它们的静态的,不能动行期内改变。除非你复写超类的方法。如果全部实现要复写的话那就没有继承的意义了!把抽象类提升为接口了或引入聚合/合成(模式)应该是一种出路。 个人观点: 接口 = 聚合/合成(模式)+ 纯抽象类 接口:定义系统中大局的被广泛复用的方法。从面向对像的角度理解面对接口编程可以使接口对它的实现者或多重继承者有一种清淅的可控边界。从代码重构的角度理解:接口的良好划分使得系统中各个层次的耦合最可能的少,使得单完测试独立............... |
|
返回顶楼 | |
发表时间:2005-10-13
说一下我的看法,面向对象技术最本来的面目是构建一个对象体系。
接口是后来出现的,最早弥补不能多继承的不足。最后变化成现在的结果:接口不在对象体系内,它代表了一种行为特征。 调用类方法表示——依赖于该类所属的对象体系。这是一个高耦合 调用接口表示——依赖于一个行为特征,而不依赖对象体系,这是一个低耦合。 大部分的框架都用接口的原因在于:它不需要了解实际运行时组件的对象体系,它只需要该组件具备其要求的行为特征。 |
|
返回顶楼 | |