第18條:接口優(yōu)于抽象類
1.內(nèi)容向?qū)?/h4>
本條內(nèi)容的主要重點(diǎn)——骨架類,集成接口和抽象類的優(yōu)點(diǎn)于一身。
2.接口的優(yōu)點(diǎn)
現(xiàn)有的類可以很容易的被更新,以實(shí)現(xiàn)新的接口。
如果你前期編寫了一個(gè)類A,后期有在系統(tǒng)中加入了一個(gè)新的接口B,當(dāng)你想讓前期編寫的類來實(shí)現(xiàn)這個(gè)接口,你只用加上一句implement B,然后在類A中實(shí)現(xiàn)里面的方法即可,不會(huì)影響到以前的類對(duì)類A的使用。接口是定義mixin(混合類型)的理想選擇。
這一條主要說的是,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。一個(gè)類除了可以實(shí)現(xiàn)一個(gè)它的主要類型接口之外,還可以加入一些輔助接口來實(shí)現(xiàn)一些新的功能。-
接口允許我們構(gòu)造非層次結(jié)構(gòu)的類型框架。
之一條主要說的是,接口可以多繼承。
層次結(jié)構(gòu)的類型:
遵守層次結(jié)構(gòu)的類型關(guān)系.png
如上圖,對(duì)于這種遵守參差結(jié)構(gòu)的類型來說,我們要用類的繼承來實(shí)現(xiàn)是容易的。但是我們遇到的類型關(guān)系并不總是遵循這種層次類型。
比如:web開發(fā),我們有一種程序猿類型為“前端攻城獅”,一種類型為“后端攻城獅”還有一種是“web全棧攻城獅”,我們要用類來表示他們?nèi)咧g的三角關(guān)系,啊不對(duì),是類型關(guān)系的話將會(huì)是一件十分困難的事情。但是如果用接口,將會(huì)十分輕松。直接定義三個(gè)類型的接口,讓“web全棧攻城獅”同時(shí)繼承前端和后端工程師即可。 接口可以使得類的增強(qiáng)變得安全。
這一點(diǎn)主要說的是第16條(復(fù)合優(yōu)于繼承)中的“包裝類”。
3. 骨架類
眾所周知,java 8之前接口是不可以有方法體的,這就是抽象類相對(duì)于接口的優(yōu)勢(shì),為了將抽象類和接口的優(yōu)勢(shì)整合起來,“骨架類”就誕生了,骨架類的做法是用一個(gè)抽象類來實(shí)現(xiàn)一個(gè)接口,在抽象類中為接口的某些方法提供實(shí)現(xiàn)。
骨架類的實(shí)現(xiàn)的一般步驟是,找出接口中的基本方法,在抽象類中聲明為抽象方法,然后用這些基本方法來實(shí)現(xiàn)其他方法,所謂基本方法,就是通過將這些方法組合或是變換,可以實(shí)現(xiàn)其他的方法。
4.有關(guān)骨架類的例子
為了便于理解,這里舉一個(gè)炒雞簡(jiǎn)單的例子,想看更深層次的例子,可以去看java類庫(kù)中的AbstractCollection<E>這個(gè)類。
例子:
假設(shè)有一個(gè)接口,它可以實(shí)現(xiàn)一組對(duì)象的求和,代碼如下:
public interface Summation<T> {
//實(shí)現(xiàn)兩個(gè)對(duì)象的相加
T towEleAdd(T obj01, T obj02);
//實(shí)現(xiàn)List求和
T listEleSum(List<T> list);
//實(shí)現(xiàn)數(shù)組求和
T arrayEleSum(T[] array);
}
根據(jù)觀察,它的基本方法只有一個(gè)T towEleAdd(T obj01, T obj02);,現(xiàn)在我們可以來實(shí)現(xiàn)他的“骨架”了:
public abstract class AbstractSummation<T> implements Summation<T> {
@Override
public abstract T towEleAdd(T obj01, T obj02);
@Override
public T listEleSum(List<T> list) {
T firstEle = null;
for (T t : list) {
if (firstEle == null) {
firstEle = t;
continue;
}
firstEle = towEleAdd(firstEle, t);
}
return firstEle;
}
@Override
public T arrayEleSum(T[] array) {
T firstEle = null;
for (T t : array) {
if (firstEle == null) {
firstEle = t;
continue;
}
firstEle = towEleAdd(firstEle, t);
}
return firstEle;
}
}
繼承這個(gè)骨架類就只用實(shí)現(xiàn)towEleAdd方法,就可以完成一組對(duì)象的求和工作了。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- java中可以用來定義允許多個(gè)實(shí)現(xiàn)的類型有兩種:接口和抽象類。 接口和抽象類的區(qū)別: 1,抽象類中可以存在某些方法...
- 一、抽象類 1、抽象類含義的概括: 當(dāng)多個(gè)類出現(xiàn)相同功能時(shí),但功能主體不同,這樣可以向上抽取,抽取時(shí)只抽取功能定義...
- Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
- 簡(jiǎn)化的時(shí)間管理流程包括主要三個(gè)步驟:收集,整理,回顧。 仔細(xì)想想,這中間流動(dòng)的都是什么?更多的是文字??墒牵覀兊?..
