#include class bird
};class sparrow : public bird
};class eagle : public bird
};class penguin : public bird
};void flyall(std::vector& v)
}void main()
為了重用flyall(std::vector&)函式,對bird*類提出約束:要求提供fly虛函式,還有fly必須成功。企鵝類違反了鳥類對外的公開承諾:會飛。當把企鵝物件強行用於flyall函式時就會發生嚴重問題。penguin類違反了liskov原則。這個繼承體系是有問題的。
pengui模組能替換bird模組良好工作於flyall,還依賴於下列條件:1)pengui模組的前置條件要弱於bird模組。例如:如果pengui要求要先吃飽魚,睡空調屋才能答應起飛,則這個前置條件太苛刻,別人很難驅動它去工作。2)pengui模組的後置條件要強於bird模組。例如:鷹類不但會飛,還飛出花樣,飛出氣勢,這個肯定是沒問題的。相反,企鵝類根本飛不出後置條件。
違反liskov原則的繼承體系了,必然要對原有的舊**做調整,進一步違反了對「新增開放,對修改封閉」的《開放封閉》原則。
void fly(std::vector& v)
}
繼承的目的:不是重用基類**,而是被重用於適用於基類的舊**裡(就像flyall那樣的舊**)
如果想重用基類的**,有其他方法:委託,或者聚合,組合等。為什麼非要走繼承這條路才能重用?也許是這是從日常生活經驗獲得的思維定勢:繼承家產,就可以使用家產;繼承文化傳統,就可以使用這些知識了。
Liskov替換原則
2.3.3 liskov替換原則 barbara liskov於1988年提出了著名的替換原則 如果對於型別s的每個物件o1存在型別t的物件o2,那麼對於所有定義了t的程式p來說,當用o1替換 o2並且s是t的子型別時,p的行為不會改變。通俗地講,就是子型別能夠完全替換父型別,而不會讓呼叫父型別的客...
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的子型別。通俗地講...