作者popcorny (毕业了..@@")
看板java
标题Re: [心得] 介面使用的心得。
时间Thu May 9 09:39:39 2013
※ 引述《PsMonkey (痞子军团团长)》之铭言:
: 从 callee 的角度来看
: 其实这跟 interface 没啥关系,因为如果
: class FooPrinter extends Printer {
: public void output(String data) { print(data); }
: }
: class Printer {
: public void output(String data) { print(data); }
: }
: 也完全符合你的叙述(但也不是说你错)
: 也就是说,单纯看 callee
: 其实参数到底是用 interface / (abstract) class 宣告都可以
非常同意...
这跟interrface/class无关
只有跟继承有关
: 当然,如果要讨论盖 OO 大楼的时候
: 什麽状况下要用 extend、什麽时候要作 abstract class
: 什麽时候该 implement interface
当初设计java
要跟c++最大不同的就是c++可以多重实作继承
但是这个会有很多问题
所以在java改成单一实作继承跟介面多重继承
这也是现在物件导向语言的主流做法
所以
interface跟(abstract)class最大的差异是
interface是可以多重介面继承
但是(abstract)class只能单一实作继承
所以当设计成(abstract) class供别人继承时
那你的孩子应该是个 A (is a) B的概念
如果设计成interface供别人继承时
那应该是A (conforms) B的概念..
所以abstract class比interface多的地方是可以提供部分实作
这对实作一些例如template method pattern的时候很好用
http://zh.wikipedia.org/wiki/%E6%A8%A1%E6%9D%BF%E6%96%B9%E6%B3%95
至於interface比abstract多的地方是可以提供多重继承
所以不会影响别人的继承树
拿来做event listerer就很好用
而有些时候也会有先定义一个Interface A
再去做一个abstract class继承A
ex:
public abstract class AbstractA implements A{
....
}
例如java.util.List<E>就有java.util.AbstractList<E>
一般的List实作可以选择直接继承AbstractList
这样可以获得AbstractList里面针对List的基本实作
跟一些utility method跟fields
但有些class可能必须继承其他class但是却想conforms List<E>
就可以选择不要extends AbstractList而直接implements List
这样的做法在java standard library很多地方都有..
好处是可以保留interface的多重界面继承的弹性
跟abstract class提供基本实作的好处
当然在搞懂上面的这些东西之前
你必须先搞清楚为什麽要去有一个最底层的List<E>的需求
那就是为了使用物件导向语言多型(polymorphism)的特性
没有这个需求,那介面就是多余的 XDD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.163.46.230
※ 编辑: popcorny 来自: 118.163.46.230 (05/09 09:40)
※ 编辑: popcorny 来自: 118.163.46.230 (05/09 09:43)
2F:推 gn00273680:Push 05/11 22:34
3F:→ adrianshum:一开初的论点出了问题。Java 并不是把 C++改成单一继承 05/12 20:45
4F:→ adrianshum:我没记错的话,虽然syntax 上 Java选择了 C++-like 05/12 20:49
5F:→ adrianshum:但血统上其实是源自 smalltalk 及相关语言(如Obj-C) 05/12 20:53
6F:→ adrianshum:所以Java 并不是把 C++ 改成单继承,而是本身他参照的 05/12 20:54
7F:→ adrianshum:语言就是单继承 05/12 20:54
8F:→ popcorny:喔喔.. 原来是这样 感谢补充 05/12 22:17
9F:推 PsMonkey:印象中还蛮多书 & 蛮多人会这样讲的 XDDDD 05/12 22:18
10F:→ PsMonkey:其实 A 版主不说,我也跟 popcorny 一样 [遮脸] 05/12 22:19
11F:→ Killercat:其实我总认为单继承唯一原因就是Object会造成钻石继承 05/12 22:35