通常,一個類如果過于複雜,首先應該考慮将其拆分為幾個小類
但有些情況,一個類雖然複雜但是不能進行拆分,比如對架構類進行擴充,比如實作布局互動複雜的安卓Activity
這個時候可以考慮通過繼承對複雜類進行階層化的開發
先說說擴充
對已有類進行擴充,有兩種方式,一種是内部擴充,即内部增添代碼,雖然可以将擴充封裝,再在原來的類内部調用,但是畢竟引入了新對象,且可能在原有類中,這個對象将廣泛分布,和原有對象夾雜,産生混亂。
另一種是外部擴充,即:1 實作新類,調用舊類;2 繼承。外部擴充的好處是,擴充部分屏蔽了原來類的複雜性,隻保留了原來類的接口,且不增加原來類的複雜性,是對原類進行擴充的理想方法。
現在說說繼承和調用舊類的比較。一個重要的方面是接口的隐藏和暴露。調用舊類的方式是預設隐藏,而繼承是預設暴露,而且繼承類之間可以存在綠色通道(protected)。在這方面說不清誰好誰壞,但是在擴充架構類上,預設暴露卻是極好的一點。因為架構類的一個要點就是維持架構接口。通過預設暴露的方式,不會帶來壞處,同時可以讓開發人員遺忘不需要的部分,專注擴充部分。
現在說說如果使用繼承進行階層化開發。
不斷繼承的結果,是形成了一條鍊,他們在重載方法調用上存在從外到内的特點。是以,每一次繼承可以看作是對原來的類加了一個層次,即,進行了擴充。将内聚的任務在新層次中實作,可以保證原類的簡潔性,同時保持新類的簡潔性。
在單繼承中,雖然必須進行堆棧式擴充,但是每一次擴充必須理清是對哪一個層次進行的擴充,這樣,依賴越低的擴充應該放在更低層,而依賴高的放在更高層。
寫到這裡,不經讓我懷念起c++的多繼承。都說多繼承是個惡魔,可是在繼承擴充方面,多繼承可是塊寶。不像單繼承,你隻能堆棧式地擴充,多繼承可以讓你的每一次擴充精準定位到你需要的層次,然後通過一次多繼承選擇自己需要的擴充部分。這需要良好的駕馭設計的能力。