Liskov替換原則


2.3.3  Liskov替換原則

Barbara Liskov於1988年提出了著名的替換原則:"如果對於類型S的每個對象O1存在類型T的對象O2,那么對於所有定義了T的程序P來說,當用O1替換 O2並且S是T的子類型時,P的行為不會改變。"通俗地講,就是子類型能夠完全替換父類型,而不會讓調用父類型的客戶程序從行為上有任何改變。

Liskov替換原則 基於這樣的一個事實,那就是客戶程序在調用某一個類時,實際上是對該類的整個繼承體系設定了一個契約,繼承體系中的所有類必須遵循這一契約,即前置條件和 后置條件必須保持一致 。這就超越了繼承中子類與父類之間形成的is-a關系,為對象繼承加上了一把嚴格的枷鎖。顯然,Liskov替換原則對於約束繼承的泛濫具有重要意義。

我個人認為,Liskov替換原則並不是要求子類不能新增父類沒有的方法或者屬性。因為從調用父類的客戶程序的角度來說,它關心的僅僅是父類的行 為,只要子類對於父類的行為是可替換的,就不算是違背該原則。恰恰相反,當你發現父類擁有子類不希望繼承,或者勉強繼承會對子類造成破壞時 ,正可以說明這個繼承體系可能存在問題,違背了Liskov替換原則。這就充分說明,子類並不關心父類的行為,但卻需要遵循父類制定的規范或契約,以滿足 客戶調用父類的期望。正所謂"蕭規曹隨",如果前人制定的規范我們不遵循,反而要去打破,那就不是繼承,而是鐵了心要另起爐灶了。

一個經典的違反Liskov替換原則的例子是正方形與矩形之間的關系。這樣的例子在談對象設計的原則時,已經啰嗦得夠多,這里我就不再贅述了 。這個例子帶來的教訓就是,現實世界中繼承的例子,不能夠完全直接套用在程序世界中。不過,作為設計的參照物,現實世界的很多規律與法則,我們仍然不可忽 視。例如鯨魚和魚,應該屬於什么關系?從生物學的角度看,鯨魚應該屬於哺乳動物,而不是魚類。沒錯,在程序世界中我們可以得出同樣的結論。如果讓鯨魚類去 繼承魚類,就完全違背了Liskov替換原則。因為魚作為父類,很多特性是鯨魚所不具備的,例如通過腮呼吸,以及卵生繁殖。那么,二者是否具有共性呢? 有,那就是它們都可以在水中"游泳",從程序設計的角度來說,它們都共同實現了一個支持"游泳"行為的接口。

如圖2-7所示的設計,可以看做是解決違背Liskov替換原則的一種常規方案,即提取兩者之間的共同點,定義一個更為通用的接口,或者新的父類。

 
圖2-7  鯨魚和魚的關系


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM