六 設計原則之黎克特制替換原則

2021-09-29 03:04:45 字數 1457 閱讀 9936

今天的部落格主題

設計原則和模式 --》設計原則之黎克特制替換原則

黎克特制替換原則 lsp (liskov substitution principle)

任何基類可以出現的地方,子類一定可以出現。

黎克特制替換原則是繼承復用的基石,只有當衍生類可以替換掉基類,基類的功能不收影響,基類才能真正被復用,衍生類也能夠在基類的基礎上增加新的行為。這樣說很籠統,簡單說就是子類可以擴充套件父類功能,但不能改變父類的功能,子類可以新增功能。

這是在講開閉原則時候的一段**,仔細看**會發現,這裡違背了裡式替換原則。

public class huaweidiscountphone extends huaweiphone 

// 手機原價

public double getoriginprice()

// 手機*** 88折

public double getprice()

}

修改下**,不應該覆蓋父類的 getprice() 方法,而是在子類增加 getdiscountprice()

public class huaweidiscountphone extends huaweiphone 

// 手機折扣價 88折

public double getdiscountprice()

}

黎克特制替換原則的特點

1.約束繼承的氾濫,也是對開閉原則的一種補充

2.增強程式的健壯性,兼顧程式的相容性,提高程式的維護性,擴充套件性。降低需求變更時引入的風險。

繼承的缺點

1.繼承是侵入性的。只要繼承,就必須擁有父類的屬性方法。

2.降低了程式的靈活性,因為只要繼承,父類就會對子類有一定的約束。

3.增加了系統的耦合性。因為在對父類方法做調整時,要考慮對子類產生的影響。

裡式替換原則是對繼承進行規範上的約束。

在翻閱資料的時候,對黎克特制替換原則舉的例子最多的就是,正方形不是長方形,企鵝不是鳥,這些例子看來都是推翻黎克特制替換原則的。

你不是說 出現基類的地方一定能出現子類嗎?

網上的例子千篇一律,沒有能直接證明黎克特制替換原則的**。個人認為它是設計原則裡面最難理解的原則。

總的說裡式替換原則體現在以下四點:

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

2.子類可以增加自己特有的方法。

3.子類過載父類方法時,方法的入參要比父類方法的入參更寬鬆些。

4.子類實現父類方法時(重寫/過載或實現抽象方法),方法的返回值要比父類更嚴格或相等。

黎克特制替換原則是不是就想 讓子類可以替代父類出現,還要保證結果不發生改變?

那就又有點不符合繼承了呀,繼承無非就是想重寫或過載父類的方法,那要不然要繼承來做什麼?兩個類還冗餘。。

抽象,太抽象了...

一般在進行設計的時候,盡量從抽象類繼承,而不是從具體類繼承。

**案例補充ing。。。

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

只看概念比較抽象,先上例項。乙個違反黎克特制替換原則的例子 乙個遵守黎克特制替換原則的例子。繪製圖形 void drawshape shape shape else if shape.type shape.square else 新增影象必需要修改drawshape方法,新增if判斷來支援新的圖形,...

六大設計原則之黎克特制替換原則

liskov substitution principle 簡稱lsp 第一種定義,如果對每乙個型別為s的物件o1,都有型別為t的物件o2,使得以t定義的所有程式p在所有的物件o1都代換成o2時,程式p的行為沒有發生變化,那麼型別s是型別t的子型別。第二種定義,所有引用基類的地方必須能透明地使用其子...

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

可以解讀為 派生類 子類 物件可以在程式中代替其基類 超類 物件。子類可以擴充套件父類的功能,但不能改變父類原有的功能。黎克特制替換原則對繼承進行了規則上的約束,這種約束主要體現在四個方面 子類可以實現父類的抽象方法,但不能重寫父類的非抽象方法。子類中可以增加自己特有的方法。當子類的方法過載父類的方...