W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
前面我們說過,構建新類的兩個基本方法是組合和繼承,如果你的主要目的是代碼重用,那么最好使用組合的方法構造新類,使用繼承的方法構造新類造成的可能問題是,無意的修改基類可能會破壞子類的實現。
關于繼承關系你可以問自己一個問題,是否它建模了一個 is-a 關系。例如,說 ArrayElement 是 Element 是合理的。你能問的另一個問題是,是否客戶想要把子類類型當作基類類型來用。
前一個版本中,LineElement 與 ArrayElement 有一個繼承關系,從那里繼承了 contents。現在它在 ArrayElement 的例子里,我們的確期待客戶會想要把 ArrayElement 當作 Element 使用。
請看下面的類層次關系圖:
看著這張圖,問問上面的問題,是否感覺其中的任何關系有可疑嗎?尤其是,對你來說 LineElement 是 ArrayElement 是否顯而易見呢?你是否認為客戶會需要把 LineElement 當作 ArrayElement 使用?實際上,我們把 LineElement 定義為 ArrayElement 主要是想重用 ArrayElement 的 contents 定義。因此或許把 LineElement 定義為 Element 的直接子類會更好一些,就像這樣:
class LineElement(s: String) extends Element {
val contents = Array(s)
override def width = s.length
override def height = 1
}
前一個版本中,LineElemen t與 ArrayElement 有一個繼承關系,從那里繼承了 contents?,F在它與 Array 有一個組合關系:在它自己的 contents 字段中持有一個字串數組的引用。有了 LineElement 的這個實現,Element 的繼承層級現在如下圖所示:
因此在選用組合還是通過繼承來構造新類時,需要根據需要選擇合適的方法。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: