抽象類作爲中等複雜層次結構的基礎並不像接口那麼靈活。一個類 - 抽象與否 - 強制執行特定類型。
想都沒想太辛苦一下吧,這裏有一個方法來啓動:
public interface Quadrilateral {
int getTopMillimeters();
int getLeftMillimeters();
int getRightMillimeters();
int getBottomMillimeters();
}
從這個原始數據,你也可以定義
getTopLeftAngle(),getTopRightAngle(),...
這將根據長度計算它們的值。
我也會強調構圖而不是繼承。最終效果確實可能是一個複雜的繼承結構。
對我來說,構圖是「Composer」類的層次結構,它不實現接口。如
public class QuadrilateralComposer {
private final int iTopMM;
private final int iBtmMM;
...
public QuadrilateralComposer(int i_topMM, int i_bottomMM, ...) {
if(i_topMM < 1) {
throw new IllegalArgumentException...
}
if(i_bottomMM < 1) {
throw new IllegalArgumentException...
}
...
iTopMM = i_topMM;
iBtmMM = i_bottomMM;
...
}
public int getTopMillimeters() {
return iTopMM;
}
...
,然後由一個抽象類組成:
public class AbstractQuadrilateral implements Quadrilateral
private final QuadrilateralComposer qc;
public AbstractQuadrilateral(int i_topLen, int i_bottomLen, ...) {
gc = new QuadrilateralComposer(i_topLen, i_bottomLen, ...);
}
public int getTopLength() {
return gc.getTopLength();
}
...
抽象類從來沒有擴展其它抽象類,他們只用內部作曲家(實際上是實現接口)。另一方面,作曲家只擴展作曲家,並在內部使用其他作曲家。
(三題:保護功能在作曲家public function_4prot()
和protected function()
,它調用_4prot
版本有時抽象類確實可以實現該接口的一切都實現在這種情況下,這將是混凝土[。非抽象的],並命名爲「SimpleXYZ」,而不是「AbstractXYZ」。最後,靜態工具函數駐留在Composer中。)
如果EVERY接口是這樣設計的,那麼ANY類可以很容易地實現ANY接口,無論他們必須實際擴展哪一類。如果抽象類擴展了其他抽象類,對於需要實現接口的類來說,這是更多的工作,但是碰巧並且不得不擴展其他的東西。
這不是你問的問題,但是學習這個概念更好地改變了我的代碼。看到它在接受的答案中提到,讓我想到了所有這一切。在過去的幾年中,我實際上已經慢慢地從繼承轉變爲構圖,並且在閱讀Effective Java之後,它就像是繼承棺材中的最後一顆釘子。
也許是'Shape'接口。 –
如果不知道班級的目的,你無法決定繼承鏈 - 這是責任。什麼是四邊形?什麼是方形的?而且你當然不需要接口,因爲當一個簡單的抽象類足夠時它們不應該被使用。 – spectre