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

2021-10-21 21:23:35 字數 2463 閱讀 8753

1.通俗來說,子類可以擴充套件父類的功能,但是不能改變父類原有的功能。

2.在程式中將乙個父類物件替換成子類物件,程式將不會產生任何錯誤和異常,反過來不成立。

3.它是實現開閉原則的重要方式之一,由於使用基類物件的地方都可以使用子類物件,程式中盡量使用父類型別來定義物件,執行時再確立子類型別,用子類物件替換父類物件。

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

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

3.當子類覆蓋或實現父類方法時,方法前置條件(形參)要比父類的方法更加寬鬆。

4、當子類的方法實現父類的(抽象)方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。

1.提高**重用性

2.多型的前提

返回值型別、方法名、引數列表相同構成方法重寫

1.子類重寫父類方法時,子類方法的訪問修飾符不能比父類更嚴格。

例子

public

class

testextends

}class

father

}class

sonextends

father

此時我們將父類物件用子類物件來替換,是可以的

public

static

void

main

(string[

] args)

重寫父類的method1方法,發現報錯

原因如下

public

static

void

main

(string[

] args)

原先我們呼叫父類的method1()方法是可以呼叫的,假如我們在用子類物件替換掉父類物件的時候,子類物件的訪問許可權為private比父類小,那麼無法呼叫也就無法完成替換,違反了黎克特制替換原則,重寫方法時也就不允許我們這樣做。

2.子類重寫父類的方法時,子類方法不能丟擲比父類更多的異常。

public

class

testextends

catch

(exception e)}}

class

father

}class

sonextends

father

}

程式中,父類的method1方法丟擲了io異常,那麼我們在呼叫的時候try catch ,子類方法如果沒有丟擲異常,子類物件可以直接替換父類物件。

但是如果父類的method1方法沒有丟擲異常,而子類方法在重寫時丟擲了異常,可以看到程式報錯

這是由於我們原來在呼叫父類方法時是不需要try catch操作的,但是在替換成了子類物件之後卻需要try catch,此時引用父類的地方無法透明的使用其子類的物件。所以不允許我們這樣重寫方法。

a.有沒有"is a"關係

b.在兩個類有了"is a"關係之後,還要考慮子類物件在替換了父類物件之後,業務邏輯是否變化,如果變化,則不能發生繼承關係。

正方形和長方形有"is a"關係。

需要考慮業務場景,在特定的業務場景下,正方形替換長方形,可能會導致業務邏輯發生變化。

public

class

liskovsubstitutionprincipletest

}class

rectangle

public

void

setlength

(double length)

public

double

getwidth()

public

void

setwidth

(double width)

}class

square

extends

rectangle

public

void

setlength

(double length)

public

double

getwidth()

public

void

setwidth

(double width)

}class

utils

}}

這裡我們需要實現的乙個業務場景是,增加長方形的寬直到寬比長多1,但是正方形長等於寬的特性讓我們無法實現這個業務場景,也就是說子類物件在替換父類物件之後,改變了原來的業務邏輯。所以正方形在這種場景下無法繼承長方形成為它的子類。

2 黎克特制替換原則

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

05黎克特制替換原則

繼承在程式設計中帶來了便利,也帶來了弊端。比如使用繼承會給程式帶來侵入性,程式的可移植性降低,增加物件之間的耦合性。如果乙個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,並且父類修改後,所涉及到子類的功能都有可能產生故障。如何正確的使用繼承?答案是黎克特制替換原則 1 引用基類的地...

02 黎克特制替換原則 LSP

lsp liskov substitution principle 黎克特制替換原則 所有引用基類 父類 的地方必須能透明地使用其子類的物件。通俗講 子類可以擴充套件父類的功能,但不能改變父類原有的功能 是實現開閉原則的重要方式之一 克服了繼承中重寫父類造成的可用性變差的缺點 它是動作正確性的保證。...