2007年8月31日 星期五

D20 令人感到麻煩的設計(5)──Abstract Class的設計

同樣的程式碼抽取到方法讓大家共用,同樣的方法抽取到共同的父類別來使用,這是設計中對於程式碼的reuse。
這是是一個簡單的繼承架構,ClassInterface下有一個DefaultClass作為基本實作類別,另外衍生了三個子類別。理論上DefaultClass應該會做出介面裡定義的全部動作,子類別在方法裡有不同的動作時再override(覆寫)父類別的的方法。

有的時候介面的方法很明顯地是該由各個子類別來決定如何實作,這個時候父類別就不可能有可以共用的方法實作。例如一個交通工具介面裡有move()方法,因為每種交通工具移動的方法不同,所以實作介面的基本類別,move()方法就應該保持為abstract等待子類別來實作。

會有人說:先隨便實作一個方法再由子類別override不是也可以嗎?設計時不該讓物件進行沒有必要的動作,不僅會令物件進行沒有定義的行為,同時不必要的override也讓程式更難追蹤。Abstract Class是無法產生實體的對應,只是對於物件的定義而不會變成物件;在意義上就像生物學裡的分類,界門綱目科屬種各定義了不同所屬物種的特徵,到最後的分類時(種)才有所有符合所有特徵定義的生物。

交通工具類別已經宣告move()為abstract,但是直接把汽車、輪船、飛機等直接繼承交通工具也會有問題,因為子類別裡還是會有多個類別有同樣動作的情形,一有改變就可能牽動到所有子類別。理想的設計是再衍成對應的分類類別,子類別再去繼承分類類別。一組類別要設計成這樣時比起快速地直接使用一個類別,當然會多花很多的時間,不過應做的工作還是該去做好的。

沒有留言:

張貼留言