一.簡稱
英文全稱是liskov substitution principle, 縮寫是lsp
二.定義
如果對每乙個型別為s的物件o1,都有型別為t的物件o2,使得以t定義的所有程式p在所有的物件o1都替換成o2時,程式p的行為沒有發生變化,那麼型別s是型別t的子型別。
簡單的說就是所有引用基類的地方必須能透明地使用其子類的物件。通俗點講,只要父類能出現的地方子類就可以出現,而且替換為子類也不會產生任何錯誤或異常,使用者根本就不需要知道是父類還是子類,但是反過來就不行,有子類出現的地方,父類未必就能適應。總的來說就是抽象。
比如從window和view的關係來看
//視窗類
public
class
window
}//測量檢視的寬高為公用**,繪製實現交給具體的子類
public
abstract
class
view
}//textview 的具體實現
public
class
textview
extends
view
}//button的具體實現
public
class
button
extends
view
}
window依賴於view,而view定義了乙個檢視抽象,measure是各個子類共享的方法,子類覆寫view的draw方法實現自己特有的功能,任何繼承自view類的子類都可以設定給view方法,就是所說的黎克特制替換。通過黎克特制替換,就可以定義各式各樣的view,然後傳遞給window,window負責將view顯示到螢幕上。
三.核心原理
核心是抽象,而抽象又依賴於繼承特性。
繼承的優缺點:
優點:
(1)**復用,減少建立類的成本,每個子類都擁有父類的方法和屬性
(2)子類和父類基本相似,但又與父類有所區別
(3)提高**的可擴充套件性
缺點:
(1)只要繼承就必須擁有父類的所有屬性和方法
(2)可能造成子類**冗餘、靈活度降低,因為子類必須擁有父類的屬性和方法。
在實際使用中要根據具體的情況來看要不要使用繼承。
四.注意事項
(1)子類的所有方法必須在父類中宣告,或子類必須實現父類中宣告的所有方法。因為根據黎克特制替換原則,為了保證系統的擴充套件性,在程式中通常使用父類來進行定義,如果乙個方法只存在子類中,在父類中不提供相應的宣告,則無法在以父類定義的物件中使用該方法。
(2)盡量把父類設計為抽象類或介面,讓子類繼承父類或實現父介面,並實現父類中宣告的方法,執行時,子類例項替換父類例項,我們可以很方便地擴充套件系統的功能,同時無須修改原有子類的**,增加新的功能可以通過增加乙個新的子類來實現。黎克特制替換原則是開閉原則的具體實現手段之一。
總結
黎克特制替換原則和開閉原則一般都是一起使用的,通過黎克特制替換來達到對擴充套件開放,對修改關閉的效果。
物件導向設計原則 黎克特制替換原則
黎克特制替換原則lsp liskov substitution principle 主要闡述了有關繼承的一些原則。子類可以擴充套件父類的功能,但不能改變父類原有的功能,如果重寫了父類的方法,就會降低整個繼承體系的復用性,如果違背了黎克特制替換原則,就很有可能出現執行錯誤 這裡以乙個鳥的例子來闡述 首...
物件導向設計原則 黎克特制替換原則
黎克特制替換原則是任何基類出現的地方,子類一定可以替換它 是建立在基於抽象 多型 繼承的基礎復用的基石,該原則能夠保證系統具有良好的拓展性,同時實現基於多型的抽象機制,能夠減少 冗餘。黎克特制替換原則要求我們在編碼時使用基類或介面去定義物件變數,使用時可以由具體實現物件進行賦值,實現變化的多樣性,完...
物件導向設計原則 黎克特制替換原則 LSP
要 求 子類可以替換父類並且出現在父類能夠出現的任何地方 這個原則也是在貫徹gof倡導的面向介面程式設計!在這個原則中父類應盡可能使用介面或者抽象類來實現!子類通過實現了父類介面,能夠替父類的使用地方!通過這個原則,我們客戶端在使用父類介面的時候,通過子類實現!意思就是說我們依賴父類介面,在客戶端宣...