Liskov替換原則

2022-02-11 00:02:32 字數 1167 閱讀 3318

2.3.3  liskov替換原則

barbara liskov於2023年提出了著名的替換原則:"如果對於型別s的每個物件o1存在型別t的物件o2,那麼對於所有定義了t的程式p來說,當用o1替換 o2並且s是t的子型別時,p的行為不會改變。"通俗地講,就是子型別能夠完全替換父型別,而不會讓呼叫父型別的客戶程式從行為上有任何改變。

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

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

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

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

圖2-7  鯨魚和魚的關係

Liskov替換原則(LSP)

注 摘自 敏捷軟體開發 原則 模式與實踐 robert c.martin 對於lsp可以做如下解釋 子型別 subtype 必須能夠替換掉它們的基型別 base type barbara liskov首次寫下這個原則是在1988年。她說到,這裡需要如下替換性質 若對每個型別s的物件o1,都存在乙個型...

軟體設計原則 LisKov替換原則(LSP)

乙個軟體實體如果使用的是乙個基類的話,一定適用於其子類,而且根本不能覺察出基類物件和子類物件的區別。陳述 barbara liskov對原則的陳述 若對每個型別s的物件o1,都存在乙個型別t的物件o2,使得在所有針對t編寫的程式p中,用o1替換o2後,程式p的行為功能不變,則s是t的子型別。通俗地講...

物件導向設計原則一 LisKov替換原則(LSP)

定義 子型別必須能夠替換掉它們的基型別。關於 is a 通常說 is a 是乙個繼承關係,如果某個將要被建立的類與現存的某個類滿足這種關係,那麼這個新類應該從這個現存中繼承。替換原則 告訴我們怎麼樣去使用物件導向三大機制中的 繼承與多型 c 語言中 很多語言也是這樣的 乙個子類是可以轉換為其基類的,...