發表時間: 2008年01月15日
注:摘自《敏捷軟件開發:原則、模式與實踐》(Robert C. Martin)
對于LSP可以做如下解釋:
子類型(subtype)必須能夠替換掉它們的基類型(base type)
Barbara Liskov首次寫下這個原則是在1988年。她說到,
這里需要如下替換性質: 若對每個類型S的對象o1,都存在一個類型T的對象o2,使得在所有針對T編寫的程序P中,用o1替換o2后,程序P行為功能不變,則S是T的子類型。
OOD中IS-A關系是就行為方式而言的,行為方式是可以進行合理假設的,是客戶程序所依賴的。
基于契約設計(Design By Contract DBC),類的編寫者顯式的規定針對類的契約。客戶代碼的編寫者通過該契約獲悉可以依賴的。契約是通過為每個方法聲明的前置條件(preconditions)和后置條件(postconditions)來指定的。要使一個方法得以執行,前置條件必須為真。執行完畢后,該方法要保證后置條件為真。
OCP是OOD中很多說法的核心。如果這個原則應用得有效,應用程學就會具有更多的可維護、可重用性以及健壯性。LSP是使OCP成為可能的主要原則之一。正是子類型的可替換性才使得使用基類型的模塊在無需修改的情況下就可以擴展。這種可替換性必需是開發人員可以隱式依賴的東西。因此,如果沒有顯式的強制基類類型的契約,那么代碼就必須良好的并且明顯的表達出這一點。
術語“IS-A”的含意過于寬泛以至于不能作為子類型的定義。子類型的正確定義是“可替換性”的,這里的可替換性可以通過顯式或者隱式的契約來定義。