??? 雖然一直覺得 interface 和abstract其實(shí)各自作用不同,而且有各自所適應(yīng)的情況。但是就是說不清楚,他們?cè)谑褂脮r(shí)應(yīng)該在注意的區(qū)別。
??? 看了 Erich Gamma的說法,恍然大悟。java interface作為接口時(shí)是應(yīng)該相對(duì)穩(wěn)定的。一旦你修改了一個(gè)接口,其實(shí)現(xiàn)都會(huì)作廢,需要按照從新修改來遵守這個(gè)已發(fā)布的契約。而從,領(lǐng)域抽象的角度來看。java 中的interface 應(yīng)該作為一個(gè)行為契約來用。所以,只有相對(duì)穩(wěn)定的行為集可以作為一個(gè)接口公告和契約發(fā)布出來,讓client調(diào)用,這才是java interface的真實(shí)含義。比如,發(fā)布一個(gè)Transcation interface作為,事務(wù)行為契約再好不過了。
??? 而abstract作為接口時(shí)是相對(duì)穩(wěn)定性是寬松的。如果你想增加一個(gè)方法,來讓一個(gè)比較特殊的實(shí)例來作為實(shí)現(xiàn)。你可以直接在抽象方法實(shí)現(xiàn)一個(gè)默認(rèn)方法,這樣其他子類就不會(huì)受到較大的牽連。從領(lǐng)域抽象的角度來說,對(duì)象既可以描述實(shí)體也可以描述行為。然而,通常一旦描述行為,使用整個(gè)對(duì)象來描述一個(gè)整體行為的(注意不是一個(gè)行為集)。所以,總體來說,abstract應(yīng)該用以描述內(nèi)部行為相對(duì)不太確定的實(shí)體,或內(nèi)部子行為不太確定的行為的。比如,java collection框架中的AbstractList
??? Erich Gamma: 接口提取出對(duì)象之間的協(xié)作關(guān)系。接口是獨(dú)立于實(shí)現(xiàn)細(xì)節(jié)的,而且它定義了協(xié)作的語匯(vocabulary)。一旦我理解了接口,我就理解了系統(tǒng)的大部分。為什么?因?yàn)楫?dāng)我理解了所有接口以后,我應(yīng)該就能夠理解關(guān)于這個(gè)問題的語匯。
??? 精辟啊。。。系統(tǒng)分治以后,整個(gè)系統(tǒng)的復(fù)雜度就轉(zhuǎn)化為子系統(tǒng)之間的交互上了。一旦定義了套接口,那么對(duì)于各個(gè)子系統(tǒng)來說已經(jīng)制導(dǎo)整個(gè)系統(tǒng)了,復(fù)雜的問題就變得簡(jiǎn)單了。
??? 看了 Erich Gamma的說法,恍然大悟。java interface作為接口時(shí)是應(yīng)該相對(duì)穩(wěn)定的。一旦你修改了一個(gè)接口,其實(shí)現(xiàn)都會(huì)作廢,需要按照從新修改來遵守這個(gè)已發(fā)布的契約。而從,領(lǐng)域抽象的角度來看。java 中的interface 應(yīng)該作為一個(gè)行為契約來用。所以,只有相對(duì)穩(wěn)定的行為集可以作為一個(gè)接口公告和契約發(fā)布出來,讓client調(diào)用,這才是java interface的真實(shí)含義。比如,發(fā)布一個(gè)Transcation interface作為,事務(wù)行為契約再好不過了。
??? 而abstract作為接口時(shí)是相對(duì)穩(wěn)定性是寬松的。如果你想增加一個(gè)方法,來讓一個(gè)比較特殊的實(shí)例來作為實(shí)現(xiàn)。你可以直接在抽象方法實(shí)現(xiàn)一個(gè)默認(rèn)方法,這樣其他子類就不會(huì)受到較大的牽連。從領(lǐng)域抽象的角度來說,對(duì)象既可以描述實(shí)體也可以描述行為。然而,通常一旦描述行為,使用整個(gè)對(duì)象來描述一個(gè)整體行為的(注意不是一個(gè)行為集)。所以,總體來說,abstract應(yīng)該用以描述內(nèi)部行為相對(duì)不太確定的實(shí)體,或內(nèi)部子行為不太確定的行為的。比如,java collection框架中的AbstractList
??? Erich Gamma: 接口提取出對(duì)象之間的協(xié)作關(guān)系。接口是獨(dú)立于實(shí)現(xiàn)細(xì)節(jié)的,而且它定義了協(xié)作的語匯(vocabulary)。一旦我理解了接口,我就理解了系統(tǒng)的大部分。為什么?因?yàn)楫?dāng)我理解了所有接口以后,我應(yīng)該就能夠理解關(guān)于這個(gè)問題的語匯。
??? 精辟啊。。。系統(tǒng)分治以后,整個(gè)系統(tǒng)的復(fù)雜度就轉(zhuǎn)化為子系統(tǒng)之間的交互上了。一旦定義了套接口,那么對(duì)于各個(gè)子系統(tǒng)來說已經(jīng)制導(dǎo)整個(gè)系統(tǒng)了,復(fù)雜的問題就變得簡(jiǎn)單了。
所以一般技術(shù)標(biāo)準(zhǔn)都是以接口形式公布。可以方便各廠商自行實(shí)現(xiàn)。所以接口主要是對(duì)外的。
abstract更大程度上是應(yīng)用在自己能掌控的內(nèi)部,比如自己是軟件開發(fā)商,那么在自己的系統(tǒng)里就可以大張旗鼓的使用abstract而不用考慮別人會(huì)怎么實(shí)現(xiàn)。
表達(dá)能力不好,說的不太清楚。也就是說如果有第三方實(shí)現(xiàn)的參與,最好用接口,如果是自己實(shí)現(xiàn),接口和abstract都可以考慮
詳細(xì)的可以參考:http://www.aygfsteel.com/flyingis/archive/2005/11/02/17879.html