第20條 類層次優先於標籤類

2022-08-29 00:33:25 字數 841 閱讀 7207

標籤類值帶有兩種甚至多種風格的例項的類,如乙個表示圓或者矩形的類:

class

figure ;

final

shape shape;

double

length;

double

width;

double

radius;

figure(

double

radius)

figure(

double length, double

width)

double

area()

}}

這種標籤類過於冗長,容易出錯,並且效率低下。

在figure類中,只有area方法是矩形或者圓都有的,將它放在類層次的根。

abstract

class

figure

class circle extends

figure

double

area()

}class rectangle extends

figure

double

area()

}

類層次可以反映正方形是一種特殊的矩形:

class square extends

rectangle

}

上述的域是被直接訪問的,而不是通過訪問方法,應該使用訪問方法。

標籤類很少適用的時候,當想要編寫乙個包含顯式標籤域的類時,考慮能否用類層次代替,當遇到乙個包含標籤域的現有類時,考慮將它重構到乙個層次結構中。

第16條 復合優先於繼承

這裡的繼承是實現繼承而非介面繼承。與方法呼叫不同的是,繼承打破了封裝性 換句話說,子類依賴於其超類中特定功能的實現細節。超類的實現有可能會隨著髮型版本的不同而發生改變,如果真的發生了變化,子類可能會遭到破壞,即使他的 完全沒有改變。因此,子類必須跟著超類的更新而改變,除非超類是專門為擴充套件而設計的...

第25條 列表優先於陣列

陣列與泛型相比,有兩個重要的不同點。陣列是協變的 如果sub是super的子型別,那麼陣列型別sub是super的子型別 相反,泛型是不可變得,對於任意兩個不同的型別t1和t2,list和list沒有子型別或超型別的關係。這段 在執行時出錯 object o new long 1 o 0 i don...

第四章 類和介面 第16條 復合優先於繼承

本條目討論的問題並不適用於介面繼承 與方法呼叫不同的是,繼承打破了封裝性,如果超類中特定功能的實現細節發生了變化,子類可能會遭到破壞,即使它的 完全沒有改變,除非超類是專門為了擴充套件而設計的,並且有很好文件說明 例項 public class instrumentedhashsetextends ...