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

2021-06-21 04:55:47 字數 969 閱讀 6272

設計模式總覽

黎克特制代換原則(liskov substitution principle lsp)物件導向設計的基本原則之一。 黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現;並且完全察覺不出父類物件和子類物件的區別。

黎克特制代換原則是乙個規範性原則,它是繼承復用的基石。只有按照這個規範來具體化抽象,才能保證這個系統正常執行!

**定義:

// 如果d派生自b;b、d指向同一物件;則test_func(b) 與 test_func(d)效果完全相同

class b

class d : public b

client:

d* d = new d();

b* b = d;

test_func(b)

test_func(d)

要實現這個原則,需要滿足一下條件

①public繼承

②不要覆蓋、過載基類中的任何函式。

③子類必須具有父類的所有性質。

下面看看幾個違背黎克特制代換規則的例子:

一、鳥與企鵝

在生物學上,企鵝屬於鳥類。所以你一定認為企鵝派生自鳥類沒有問題。但注意,這裡是軟體學!不是生物學!眾所周知,鳥是可以飛的,那麼鳥類中肯定有乙個fly函式。若企鵝派生自鳥類,那麼根據黎克特制替換原則,企鵝具有父類所有的性質。換言之,就是企鵝也會飛了。會飛的企鵝,那還是企鵝嗎?!

這個例子告訴我們,在繼承時,一定要遵守黎克特制替換原則,使子類具有父類的所有性質!

二、覆蓋基類函式

class a

}class b extends a

}public class client

}

這裡會發現,同樣是b的物件,同樣的運算,兩個結果卻截然不同。

所以,若有需求,則用虛函式重寫基類函式,但不能過載或覆蓋基類函式。

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

如果對乙個型別為s的物件o1,都有型別為t的物件o2,使得以s定義的所有程式p 中所有的物件o1都替換成o2是,程式p的行為沒有發生變化,那麼型別t是型別s的子型別。按照黎克特制替換原則,當多個類之間存在繼承關係時,通常應該使用父類或介面來指向子類的物件,這樣有利於提高系統的可擴充套件性。我們都知道...

設計模式之六大原則 黎克特制替換原則(LSP)

黎克特制替換原則 liskov substitution principel 是解決繼承帶來的問題。繼承的優點 繼承的缺點 定義 所有引用基類的地方必須能透明地使用其子類的物件。通俗點講,只要父類能出現的地方子類就可以出現,而且替換為子類也不會產生任何錯誤或異常,使用者可能根本就不需要知道是父類還是...

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

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