天天學設計模式5 黎克特制替換原則

2021-09-30 12:52:00 字數 914 閱讀 5537

不知道為什麼基本每乙個介紹黎克特制替換原則的文章都要先在開頭介紹黎克特制替換法則的由來,可能這個人實在很屌吧,「裡」是這位麻省理工的教授名字的第乙個發音。

這個如此屌的教授給出的定義也如此厲害:

定義1:如果對每乙個型別為 t1的物件 o1,都有型別為 t2 的物件o2,使得以 t1定義的所有程式 p 在所有的物件 o1 都代換成 o2 時,程式 p 的行為沒有發生變化,那麼型別 t2 是型別 t1 的子型別。

定義2:所有引用基類的地方必須能透明地使用其子類的物件。

看不懂吧,換個姿勢看

通俗的定義:所有引用基類的地方必須能透明地使用其子類的物件。

更通俗的定義:子類可以擴充套件父類的功能,但不能改變父類原有的功能。

這裡所說的改變父類原有功能主要是說不要去重寫父類的功能,也盡量少過載父類的功能

我看有些部落格都提及過這個,但很少給出例子,我在這給出相應的例子,希望能幫助理解。前兩個沒什麼問題,主要是後面兩個

黎克特制替換原則包含以下4層含義:

(1)子類可以實現父類的抽象方法,但是不能覆蓋父類的非抽象方法。

(2)子類中可以增加自己特有的方法。

(3)當子類覆蓋或實現父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入引數更寬鬆。

這裡設vine是liquid的子類

class  father

void drink(vine vine)

class  son

void drink(liquid liquid)

(4)當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。

這裡設chinese是voice的子類

class  father

public voice speak()

class  son

public chinese speak()

設計原則2 黎克特制替換原則

1.通俗來說,子類可以擴充套件父類的功能,但是不能改變父類原有的功能。2.在程式中將乙個父類物件替換成子類物件,程式將不會產生任何錯誤和異常,反過來不成立。3.它是實現開閉原則的重要方式之一,由於使用基類物件的地方都可以使用子類物件,程式中盡量使用父類型別來定義物件,執行時再確立子類型別,用子類物件...

2 黎克特制替換原則

肯定有不少人跟我剛看到這項原則的時候一樣,對這個原則的名字充滿疑惑。其實原因就是這項原則最早是在1988年,由麻省理工學院的一位姓裡的女士 barbara liskov 提出來的。如果對每乙個型別為 t1的物件 o1,都有型別為 t2 的物件o2,使得以 t1定義的所有程式 p 在所有的物件 o1 ...

05黎克特制替換原則

繼承在程式設計中帶來了便利,也帶來了弊端。比如使用繼承會給程式帶來侵入性,程式的可移植性降低,增加物件之間的耦合性。如果乙個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,並且父類修改後,所涉及到子類的功能都有可能產生故障。如何正確的使用繼承?答案是黎克特制替換原則 1 引用基類的地...