七 LSP 黎克特制替換原則

2022-05-11 14:29:43 字數 1111 閱讀 4644

子類的物件提供了父類的所有行為,且加上子類額外的一些東西(可以是功能,可以是屬性)。當程式基於父類實現時,如果將子類替換父類而程式不需修改,則說明符合lsp原則。

這個解釋看的似懂非懂,再看下面更進一步的解釋:

函式使用指向父類的指標或引用時,必須能夠在不知道子類型別的情況下使用子類的物件。

子類必須能夠替換成它們的父類

這其中存在這樣的概念:方法呼叫者(c)和方法提供者(p)。c呼叫p提供的方法,p的方法返回給c處理的結果。中間的過程c是不需要知道,也不會知道的。當c呼叫p的方法時,如果將p替換成sub_p的子類,那麼c得到的輸出結果也是正確的,c無需修改自身。

這裡還有個問題是如何滿足lsp原則,或者說,什麼情況下子類才可以替換父類?要滿足lsp原則,需要遵守以下原則:

sub_p必須實現或繼承p的所有公共方法,否則c呼叫p中有,而sub_p中沒有的方法,那麼執行時就會出錯。

sub_p每個方法的輸入引數必須和p一樣,否則呼叫父類的**不能呼叫子類。

sub_p每個方法的輸出必須不比p少,否則基於父類的輸出做的處理就無法完成。

第三條中所說的「不比父類少」,是指子類的輸出可以比父類多,也就是父類方法的輸出是子類方法的子集。

物件導向語言提供的繼承,已經天生的滿足了1,2兩條。除非是子類重寫父類的方法,那麼就要依照1,2的原則來重寫。(重寫與過載的區別:重寫要求函式名,傳參個數\型別,返回值型別必須相同,訪問修飾符子類的必須大於父類的。僅函式名相同,其他不同,則為過載。過載是多型的一種實現 詳解傳送門)

從上面的三條原則中可以看出約定只是約束了父類、子類的輸入輸出,並沒有約束中間的處理過程。

經典的lsp例子:長方形與正方形。數學概念中正方形是長方形的特殊情況,也就是說正方形是長方形的子類。但是在物件導向領域中,正方形是不能作為長方形的子類的。因為正方形設定了高就等於設定了寬,設定了寬就等於設定了高。那麼按照長方形的計算規則,最終面積將是最後一次設定高或寬的數值的乘積。長方形高5,寬4,面積為20。替換成正方形後,最後一次設定的如果是高的值,那麼面積將是25;如果是寬,那麼面積將是16。都不等於20。那麼就不能用正方形來替換長方形,否則c呼叫的結果會不同。

黎克特制替換原則,LSP

所有引用基類的地方必須能夠透明地使用其子類的物件。通俗點講,只要父類能出現的地方子類就可以出現,而且替換為子類也不會產生任務異常。我們知道物件導向語言的三大特性就是繼承 封裝 多台,黎克特制替換原則就是依賴於繼承 多型,建立抽象,通過抽象建立規範,在執行時替換成具體的物件,保證系統的拓展性 靈活性。...

設計原則之黎克特制替換原則(LSP)

lsp 黎克特制替換原則 兩種定義 型別t是型別s的子型別 所用引用基類的地方必須能透明的使用期子類物件 為什麼要使用黎克特制替換原則 讓繼承中的 利 大於 弊 發揮最大作用,同時減少 弊 所帶來的麻煩 繼承的優點是什麼?缺點?黎克特制替換要求凡是使用基類的地方,子類一定適用,因此子類必須具備基類的...

物件導向設計原則 黎克特制替換原則 LSP

要 求 子類可以替換父類並且出現在父類能夠出現的任何地方 這個原則也是在貫徹gof倡導的面向介面程式設計!在這個原則中父類應盡可能使用介面或者抽象類來實現!子類通過實現了父類介面,能夠替父類的使用地方!通過這個原則,我們客戶端在使用父類介面的時候,通過子類實現!意思就是說我們依賴父類介面,在客戶端宣...