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