1)繼承包含這樣一層含義:父類中凡是已經實現好的方法,實際上是在設定規範和契約,雖然它不強制要求所有的子類必須遵循這些契約,但是如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞。
2)繼承在給程式設計帶來便利的同時,也帶來了弊端。比如使用繼承會給程式帶來侵入性,程式的可移植性降低, 增加物件間的耦合性,如果乙個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,並且父類修改後,所有涉及到子類的功能都有可能產生故障
3)問題提出:在程式設計中,如何正確的使用繼承? => 黎克特制替換原則
1)黎克特制替換原則(liskov substitution principle)在 1988 年,由麻省理工學院的以為姓裡的女士提出的。
2)如果對每個型別為 t1 的物件 o1,都有型別為 t2 的物件 o2,使得以 t1 定義的所有程式 p 在所有的物件 o1 都代換成 o2 時,程式 p 的行為沒有發生變化,那麼型別 t2 是型別 t1 的子型別。換句話說,所有引用基類的地方必須能透明地使用其子類的物件。
3)在使用繼承時,遵循黎克特制替換原則,在子類中盡量不要重寫父類的方法
4)黎克特制替換原則告訴我們,繼承實際上讓兩個類耦合性增強了,在適當的情況下,可以通過聚合,組合,依賴 來解決問題。.
public
class
liskov
}// a 類
classa}
// b 類繼承了 a
// 增加了乙個新功能:完成兩個數相加,然後和 9 求和
class
bextends
apublic
intfunc2
(int a,
int b)
}
1)我們發現原來執行正常的相減功能發生了錯誤。原因就是類 b 無意中重寫了父類的方法,造成原有功能出現錯誤。在實際程式設計中,我們常常會通過重寫父類的方法完成新的功能,這樣寫起來雖然簡單,但整個繼承體系的
復用性會比較差。特別是執行多型比較頻繁的時候
2)通用的做法是:原來的父類和子類都繼承乙個更通俗的基類,原有的繼承關係去掉,採用依賴,聚合,組合等關係代替.
代 碼實
現\color
**實現
public
class
liskov
}//建立乙個更加基礎的基類
class
base
// a 類
class
aextends
base
}// b 類繼承了 a
// 增加了乙個新功能:完成兩個數相加,然後和 9 求和
class
bextends
base
public
intfunc2
(int a,
int b)
//我們仍然想使用 a 的方法
public
intfunc3
(int a,
int b)
}
設計模式七大原則之黎克特制替換原則
如果對每個型別為t1 的物件 o1,都有型別為t2的物件o2,使得以t1定義的所以程式p中所有的物件o1都代換為o2時,程式p的行為不發生變化,那麼型別t2是型別t1的子型別。換句話說 所有引用基類的地方必須能透明地使用其子類的物件 使用繼承是遵循黎克特制替換原則意味著 在子類中盡量不要重寫父類方法...
設計模式 七大原則之 黎克特制替換原則
任何能使用父類物件的地方,都應該能透明的替換為子類物件 也就說,子類物件可以隨時隨地替換父類物件,且替換完以後,語法不會報錯,業務邏輯也不會出現問題 反例 正方形不是長方形 1.提高 餓的重用性 2.多型的前提 主要看有沒有 is a 關係a.主要看有沒有 is a 關係 b.在兩個類有了is a關...
設計模式七大原則之黎克特制替換原則
黎克特制替換原則 所有引用基類的地方,必須能透明的使用其子類的物件。通俗的理解 子類可以擴充套件父類的功能,但不能改變父類原有的功能。示例 1 電腦 2public abstract class computer36 7 8 膝上型電腦 9 10class laptopcommputer compu...