[讨论]再论点圆球的设计问题------面向对象设计的实际运用
我近来看到一段文字,讲的是面向对象设计中的一些问题,我觉得跟前面大家提到的那个什么点,圆,球设计的问题比较相关的,不知道大家看到这段文字是什么感想。我觉得理论就是理论,我们不能灵活运用的话,已经使得理论打了一些折扣。
//-----------------------------------------------------
文章如下:
//-----------------------
繼承(Inheritance )
絕對不要以 public inheritance 來實作 "IS-ALMOST-A" 的關係。我曾經看過某
些程式員,甚至是經驗豐富的程式員,以 public 方式繼承一個 base ,並以
「保存 base class 的語意」的方式改寫大部份虛擬函式。然而在此情況下,
某些時候以 Derived object 做為一個 Base object ,其行為並不完全是 Base
的client所期望。Robert Martin 常引用一個例子,從 Rectangle class 身上
衍生下來Square class 。正方形是矩形,這在數學上或許為真,但在 classes
的世界中不一定為真。例如,假設 Rectangle class 有一個虛擬函式 SetWidth(int)。
Square 設定寬度時應該很自然地也設定高度,使形狀永遠保持正方。但是程
式某處有一些碼,它們以多型方式(polymorphically )運用Rectangle objects ,
它們並不預期寬度的改變也會影響高度,畢竟那對矩形而言不是真的。這是
「public inheritance 違反 LSP 」的一個好例子,因為 derived class
並未陳述與base class 相同的語意。它違反了 public inheritance 的關鍵誡律:
「不要求更多,也不承諾更少」。一點點不相容罷了,沒有人會以危險的方式這
麼使用 差勁的設計,然後再花更多天的時間去修正它。不要被誘惑,只要說 no
就是了。如果其行為不像 Base ,那就不要以「使它看起來像個 Base 」的方式
來衍生它。設計準則:總是確定 public inheritance 用以模塑 IS-A 和
並符合 求