黎克特制代換原則C 詳解

2021-05-27 10:06:50 字數 1696 閱讀 8813

看了一大堆的資料講解關於黎克特制代換原則,在這裡我想分享給大家。

黎克特制代換原則(liskov substitution principle lsp)是物件導向設計的基本原則之一。 黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。 lsp是繼承復用的基石,只有當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正被復用,而子類也能夠在父類的基礎上增加新的行為。黎克特制代換原則是對「開-閉」原則的補充。實現「開-閉」原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以黎克特制代換原則是對實現抽象化的具體步驟的規範。

下面舉例說明什麼是裡代換原則

例項1   正方形不是長方形

在幾何當中,正方形肯定是長方形,只不過它是特殊的長方形,四條邊都相等,利用物件導向的繼承關係,我們讓正方形繼承長方形,**如下:

// c#講解黎克特制代換原則

// 例項名稱:正方形不是長方形

using system;

// 長方形類

class rectangle 

public

intgetwidth

()public

virtual

void

setlength

(int length)

public

virtual

void

setwidth

(int width)

}// 正方形類square

class square : rectangle 

public

override

void

setwidth

(int width)}/*

* 由於正方形的長度和寬度必須相等,所以在方法setlength和setwidth中,

* 對長度和寬度賦值相同。類testrectangle是我們的軟體系統中的乙個元件,

* 它有乙個resize方法要用到基類rectangle,resize方法的功能是模擬長方形寬度逐步增長的效果

*///測試類testrectangle

class testrectangle 

console.

writeline

("設定寬度結束");}

static

void

main()}

我們執行一下這段**就會發現,假如我們把乙個普通長方形的例項作為引數傳入resize方法,就會看到長方形寬度逐漸增長的效果,當寬度大於長度,**就會停止,這種行為的結果符合我們的預期;假如我們利用黎克特制代換所說的,把子類的例項賦給父類,再把父類(正方形)的例項作為引數傳入resize方法後,就會看到正方形的寬度和長度都在不斷增長,**會一直執行下去,直至系統產生溢位錯誤。所以,普通的長方形是適合這段**的,正方形不適合。

我們得出結論:在resize方法中,rectangle型別的引數是不能被square型別的引數所代替,如果進行了替換就得不到預期結果。因此,square類和rectangle類之間的繼承關係違反了黎克特制代換原則,它們之間的繼承關係不成立,正方形不是長方形。

當執行程式的時候,長方形可以正常的改變長方形的寬度,而正方形不能改變寬度。黎克特制代換原則說明了我們不能亂用繼承,這裡長方形的長和寬和正方形的長和寬明顯有不同的特點,所以正方形繼承長方形是錯誤的,正確的寫法是我們可以把正方形和長方形抽象出來,再讓正方形和長方形繼承這個抽象類,從而這兩個類互不影響,各實現各的功能。

黎克特制代換原則

黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的...

黎克特制代換原則

黎克特制代換原則 黎克特制代換原則 子型別必須能夠替換掉它們的父型別。就是說乙個軟體實體,如果使用的是乙個父類的話,那麼一定適用於其子類,而且,它覺察不出父類物件和子類物件的區別,也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化。只有當子類可以替換掉父類,軟體單位的功能不收到影響時,...

黎克特制代換原則

黎克特制代換原則 子型別必須能替換掉它們的父型別.只有當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正的被復用,而子類也能夠在父類的基礎上增加新的行為.比如說,貓類繼承動物類,動物類擁有吃喝叫跑等行為,當某一天,我們需要狗,牛,羊也擁有類似的行為,由於它們都是繼承於動物,所以除了更改例...