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

2021-10-10 03:35:05 字數 1679 閱讀 3650

設計模式 – 黎克特制替換原則

oo 中的繼承性的思考和說明

繼承包含這樣一層含義:父類中凡是已經實現好的方法,實際上是在設定規範和契約,雖然它不強制要求所有的子類必須遵循這些契約,但是如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞。

繼承在給程式設計帶來便利的同時,也帶來了弊端。比如使用繼承會給程式帶來侵入性,程式的可移植性降低, 增加物件間的耦合性,如果乙個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,並且父類修改後,所有涉及到子類的功能都有可能產生故障

問題提出:在程式設計中,如何正確的使用繼承? => 黎克特制替換原則

黎克特制替換原則(liskov substitution principle)在 1988 年,由麻省理工學院的一位姓裡的女士提出的。

如果對每個型別為 t1 的物件 o1,都有型別為 t2 的物件 o2,使得以 t1 定義的所有程式 p 在所有的物件 o1 都代換成 o2 時,程式 p 的行為沒有發生變化,那麼型別 t2 是型別 t1 的子型別。換句話說,所有引用基類的地方必須能透明地使用其子類的物件。在使用繼承時,遵循黎克特制替換原則,在子類中盡量不要重寫父類的方法黎克特制替換原則告訴我們,繼承實際上讓兩個類耦合性增強了,在適當的情況下,可以通過聚合,組合,依賴 來解決問題。

public

class

liskov

}// a 類

classa}

// b 類繼承了 a

// 增加了乙個新功能:完成兩個數相加,然後和 9 求和

class

bextends

apublic

intfunc2

(int a,

int b)

}

解決問題

我們發現原來執行正常的相減功能發生了錯誤。原因就是類 b 無意中重寫了父類的方法,造成原有功能出現錯誤。在實際程式設計中,我們常常會通過重寫父類的方法完成新的功能,這樣寫起來雖然簡單,但整個繼承體系的復用性會比較差。特別是執行多型比較頻繁的時候

通用的做法是:原來的父類和子類都繼承乙個更通俗的基類,原有的繼承關係去掉,採用依賴,聚合,組合等關係代替

改進方法

}//建立乙個更加基礎的基類

class

base

// a 類

class

aextends

base

}// b 類繼承了 a

// 增加了乙個新功能:完成兩個數相加,然後和 9 求和

class

bextends

base

public

intfunc2

(int a,

int b)

//我們仍然想使用 a 的方法

public

intfunc3

(int a,

int b)

}

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

設計模式 黎克特制替換原則 物件導向的語言繼承必不可少的,有如下優點 共享,減少建立類的工作量 提高 的重用性 提高 的可擴充套件性 提高 的可擴充套件性 提高產品 的開放性 繼承侵入性 只要繼承,必須擁有父類的內容 降低 的靈活性,子類必須擁有父類的屬性和方法 增強耦合性。黎克特制替換原則,為繼承...

設計模式 (黎克特制替換原則)

黎克特制替換原則的引入 是針對物件導向中的繼承的缺點 乙個原則首先先介紹下它的定義 黎克特制替換原則為繼承定義了規範,下面我用書中看到的例子來說 1.子類必須完全實現父類的方法 首先先定義乙個槍的抽象類 public abstract class abstractgun 實現類的定義,不同的槍枝進行...

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

1 繼承包含這樣乙個含義 父類中凡是已經實現好的方法,實際上是在設定規範和契約,雖然他不強制要求所有子類遵循這些契約,但如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞。2 繼承給程式帶來便利與帶來了弊端。比如繼承會給程式帶來侵入性,程式可移植性降低,增加物件間的耦合度。如果這個類被...