一:里式替換原則:
(1):里氏替換原則(Liskov Substitution Principle,LSP)由麻省理工學院計算機科學實驗室的里斯科夫(Liskov)女士在 1987 年的“面向物件技術的高峰會議”(OOPSLA)上發表的一篇文章《資料抽象和層次》(Data Abstraction and Hierarchy)里提出來的,她提出:繼承必須確保超類所擁有的性質在子類中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects),
(2):里氏替換原則主要闡述了有關繼承的一些原則,也就是什么時候應該使用繼承,什么時候不應該使用繼承,以及其中蘊含的原理,里氏替換原是繼承復用的基礎,它反映了基類與子類之間的關系,是對開閉原則的補充,是對實作抽象化的具體步驟的規范,
二:里式替換原則的作用:
(1):里氏替換原則是實作開閉原則的重要方式之一,
(2):它克服了繼承中重寫父類造成的可復用性變差的缺點,
(3):它是動作正確性的保證,即類的擴展不會給已有的系統引入新的錯誤,降低了代碼出錯的可能性,
(4):加強程式的健壯性,同時變更時可以做到非常好的兼容性,提高程式的維護性、可擴展性,降低需求變更時引入的風險,
三:里式替換原則的定義:
(1):子類可以實作父類的抽象方法,但不能覆寫父類的非抽象方法
(2):子類中可以增加自己特有的方法
(3):當子類的方法多載父類的方法時,方法的前置條件(即方法的輸入引數)要比父類的方法更寬松
(4):當子類的方法實作父類的方法時(重寫/多載或實作抽象方法),方法的后置條件(即方法的的輸出/回傳值)要比父類的方法更嚴格或相等
四:代碼實作
public class Bird { /** * 飛行時速 */ public double fly; public void setFly(double fy){ this.fly=fy; } public double getTime(double road){ return (road/fly); } } class SparRow extends Bird{ } class PenGuin extends Bird{ public void setFly(double fy){ fly=0; } } class Test{ public static void main(String[] args) { Bird bird=new SparRow(); Bird bird1=new PenGuin(); bird.setFly(110); bird1.setFly(110); try{ System.out.println("麻雀飛了"+bird.getTime(200)+"公里"); System.out.println("企鵝飛了"+bird1.getTime(200)+"公里"); }catch (Exception e){ System.out.println("出現錯誤"); } } }
運行結果:

企鵝從科學的角度來說是鳥類動物,但是它不會飛,所以不能定義成鳥類,
此時結果出現了正無窮的錯誤,因為PenGuin類違背了里式替換原則,重寫了父類的方法,解決方法:取消企鵝原來的繼承關系,定義鳥類和企鵝類更一般的父類,
如下圖:

企鵝繼承了動物類,擁有了跑的方法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/270924.html
標籤:面向對象
上一篇:后端技術階段性學習總結
下一篇:多執行緒
