對象導論之繼承(二)

“是一個”與“像是一個”關係
  對於繼承可能會引發某種爭論:繼承應該只覆蓋基類的方法(而並不添加在基類中沒有的新方法)嗎?如果這樣做,就意味着導出類和基類是完全相同的類型,因爲它們具有完全相同的接口。結果可以用一個導出類對象類完全代替一個基類對象。這可以被視爲純粹替代,通常稱之爲替代原則。在某種意義上,這是一種處理繼承的理想方式。我們經常將這種情況下的基類與導出類之間的關係稱之爲is-a(是一個)關係,因爲可以說“一個圓形就是一個幾何形狀”。判斷是否繼承,就是要確定是否可以用is-a來描述類之間的關係,並使之具有實際意義。
  有時必須在導出類型中添加新的接口元素,這樣也就擴展了接口。這個新的類型仍然可以替代基類,但是這種代替並不完美,因爲基類無法訪問新添加的方法。這種情況完美可以描述爲is-like-a(像是一個)關係。新類型具有舊類型的接口,但是它還包含其他方法,所以不能說它們完全相同。以空調爲例,假設房子裏已經佈線安裝好了所有的冷氣設備的控制器,也就是說,房子具備了讓你控制冷氣設備的接口。想像一下,如果空調壞了,你用一個既能製冷又能制熱的熱力泵替換它,那麼這個熱力泵就is-like-a空調,但是他可以做更多的事。因爲房子的控制系統被設計爲只能控制冷氣設備,所以它只能和新對象中的製冷部分進行通信。儘管新對象的接口已經被擴展了,但是現有系統除了原來接口之外,對其他東西一無所知。
  在這裏插入圖片描述
  當然,在看過這個設計之後,很顯然會發現,製冷系統這個基類不夠一般化,應該將其更名爲“溫度控制系統”,使其可以包括制熱功能,這樣我們就可以套用替代原則了。這張圖說明了在現實世界中進行設計時可能會發生的事情。
  當你看到替代原則時,很容易會認爲這種方式(純粹替代)是唯一可行的方式,而且事實上,用這種方式設計是很好的。但是你會時常發現,同樣顯然的是你必須在導出類的接口中添加新方法。只要仔細審視,兩種方法的使用場合應該是相當明顯的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章