java設計模式-裏式替換原則

一:裏式替換原則:ui

(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):里氏替換原則主要闡述了有關繼承的一些原則,也就是何時應該使用繼承,何時不該該使用繼承,以及其中蘊含的原理。里氏替換原是繼承複用的基礎,它反映了基類與子類之間的關係,是對開閉原則的補充,是對實現抽象化的具體步驟的規範。
this

 

二:裏式替換原則的做用:spa

(1):里氏替換原則是實現開閉原則的重要方式之一。code

(2):它克服了繼承中重寫父類形成的可複用性變差的缺點。對象

(3):它是動做正確性的保證。即類的擴展不會給已有的系統引入新的錯誤,下降了代碼出錯的可能性。blog

(4):增強程序的健壯性,同時變動時能夠作到很是好的兼容性,提升程序的維護性、可擴展性,下降需求變動時引入的風險。繼承

 

三:裏式替換原則的定義:ip

(1):子類能夠實現父類的抽象方法,但不能覆蓋父類的非抽象方法ci

(2):子類中能夠增長本身特有的方法get

(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類違背了裏式替換原則,重寫了父類的方法,解決方法:取消企鵝原來的繼承關係,定義鳥類和企鵝類更通常的父類。

以下圖:

 

 

 

 

 

 企鵝繼承了動物類,擁有了跑的方法。

相關文章
相關標籤/搜索