/FLEX/thread-2978-1-1.aspx)。那時候我給它們分別起了個非常具有比喻意味的別名——改裝 和 組裝。是以汽車為例的,比如我們要給壹輛量產車上加上壹個大號的尾翼(最近由於飛車黨撞人事件,網絡上都在聲討非法改裝,與本例無關,我這裏只是舉個例子,最終要說明的還是編程技術問題),我們可以理解為以原來的車為基礎,在基礎之上為了擴展更能而加裝了尾翼;另壹種思維方式,我們也可以理解為我們是在“制造”壹輛賽車,用了兩個“零件”,壹個是壹輛量產車,另壹個是賽車尾翼。
這兩種“思路”反應在程序上,就是 繼承 與 復合 的關系。按照本條的“精神”,如果可以用復合實現,那麽就該優先使用復合,而不是繼承。從自造Flex控件的工程中,我的壹點體會來看,我感覺Flex的控件既不是轉為繼承而設計的(那些控件的超類除外),也並不明確禁止妳去擴展。而在實際中確實發現,如果妳不能完全讀懂並駕馭原控件的源碼,並能很好的改寫所有妳該改寫的方法,那麽使用繼承確實是壹件很危險的事情。比如我就遇到了無法擴展原控件的顯示區域的問題。穩妥的辦法就是使用復合,當然也會帶來壹些小麻煩,就如同本條中例子(書第65頁)壹樣也會遇到這樣的事情,就是如果妳想將原控件(“超類”,例中的HashSet)中的公有成員依然暴露出來的話,就必須逐壹為它們寫getter方法。