OO中繼承的包含一層這樣的含義:父類中凡是已經實現好的方法,實際上是在設定規范的契約,雖然它不強制要求所有的父類遵循這些契約,但是如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞。
繼承在給程序設計帶來便利的同時,也帶來了弊端。比如使用繼承會給程序帶入侵入性,程序的可移植性降低,增加對象間的耦合性,如果一個類被其他的類所繼承,則當這個類需要修改的時候,必須考慮到所有的子類,並且父類修改后,所有涉及到子類的功能都有可能產生故障。
繼承優點:提高代碼復用性、可擴展性
繼承缺點:侵入性(只要繼承就必須擁有父類的所有方法和屬性,一定程序約束子類);耦合性增強(父類修改時需要考慮所有子類,很可能造成子類功能出現故障)
一、里氏替換原則
在使用繼承時,遵循里氏替換原則,在子類中盡量不要重寫父類的方法。
里氏替換原則告訴我們,繼承實際上讓兩個類耦合性增強,在適當的情況下,可以通過聚合、組合、依賴來解決問題
二、案例演示
案例地址:https://github.com/Simple-Coder/design-pattern
1、代碼實現
問題:發現原有正常的相減功能發生了錯誤,原因就是B類無意中重寫了父類的方法,造成原有功能出現錯誤,在實際編程中,我們常常會通過重寫父類的方法完成新的功能,這樣寫起來雖然簡單,但整個繼承體系的復用性會比較差
通用做法:原來的父類和子類都繼承一個更加通俗的基類,原有的繼承關系去掉,采用依賴、聚合、組合等關系代替。
2、UML類圖比較
原有B是繼承A,現在將B類提升,使其成為Base的子類,如果B類還要用到A類,可以采用依賴、聚合、組合等關系,這樣就滿足了里氏替換原則。
三、總結
里氏替換原則,一句話:在子類中盡量不要重寫父類的方法