看了一大堆的資料講解關於黎克特制代換原則,在這裡我想分享給大家。
黎克特制代換原則(liskov substitution principle lsp)是物件導向設計的基本原則之一。 黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。 lsp是繼承復用的基石,只有當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正被復用,而子類也能夠在父類的基礎上增加新的行為。黎克特制代換原則是對「開-閉」原則的補充。實現「開-閉」原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以黎克特制代換原則是對實現抽象化的具體步驟的規範。
下面舉例說明什麼是裡代換原則
例項1 正方形不是長方形
在幾何當中,正方形肯定是長方形,只不過它是特殊的長方形,四條邊都相等,利用物件導向的繼承關係,我們讓正方形繼承長方形,**如下:
; ahk講解黎克特制代換原則
; 例項名稱:正方形不是長方形
; 長方形類
class rectangle
getwidth()
setlength(length)
setwidth(width) }
; 正方形類square
class square extends rectangle
setwidth(width)
}/* * 由於正方形的長度和寬度必須相等,所以在方法setlength和setwidth中,
* 對長度和寬度賦值相同
*resize方法要用到基類rectangle,resize方法的功能是模擬長方形寬度逐步增長的效果
*/;測試方法改變長方形的寬,將寬設為比高大
resize(objrect) ;引數是rectangle
msgbox % "設定寬度結束"
}
main:
我們執行一下這段**就會發現,假如我們把乙個普通長方形的例項作為引數傳入resize方法,就會看到長方形寬度逐漸增長的效果,當寬度大於長度,**就會停止,這種行為的結果符合我們的預期;假如我們利用黎克特制代換所說的,把子類的例項賦給父類,再把父類(正方形)的例項作為引數傳入resize方法後,就會看到正方形的寬度和長度都在不斷增長,**會一直執行下去,直至系統產生溢位錯誤。所以,普通的長方形是適合這段**的,正方形不適合。
我們得出結論:在resize方法中,rectangle型別的引數是不能被square型別的引數所代替,如果進行了替換就得不到預期結果。因此,square類和rectangle類之間的繼承關係違反了黎克特制代換原則,它們之間的繼承關係不成立,正方形不是長方形。
當執行程式的時候,長方形可以正常的改變長方形的寬度,而正方形不能改變寬度。黎克特制代換原則說明了我們不能亂用繼承,這裡長方形的長和寬和正方形的長和寬明顯有不同的特點,所以正方形繼承長方形是錯誤的。
總結前人的諸多經驗來看,黎克特制替換原則主要是有四點:
1. 子類不要覆蓋父類的非抽象的方法。可以實現其抽象方法。
2. 子類可以實現自己獨有的方法。
3. 子類的方法重寫父類方法的時候,引數部分,要比父類的引數範圍要大或者等於(寬鬆)。釋義:舉個例子》如果說父類的方法中形參是arraylist,那麼,其子類重寫這個方法的時候,形參要是list.
4. 子類重寫父類方法的時候,返回值要求,父類的返回值要比子類的返回值要小於或者等於。
黎克特制代換原則C 詳解
看了一大堆的資料講解關於黎克特制代換原則,在這裡我想分享給大家。黎克特制代換原則 liskov substitution principle lsp 是物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當子類可以替換掉父類,軟體單...
黎克特制代換原則
黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的...
黎克特制代換原則
黎克特制代換原則 黎克特制代換原則 子型別必須能夠替換掉它們的父型別。就是說乙個軟體實體,如果使用的是乙個父類的話,那麼一定適用於其子類,而且,它覺察不出父類物件和子類物件的區別,也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化。只有當子類可以替換掉父類,軟體單位的功能不收到影響時,...