里氏替換原則的定義java
里氏替換原則(Liskov Substitution Principle,LSP)由麻省理工學院計算機科學實驗室的里斯科夫(Liskov)女士在 1987 年的「面向對象技術的高峯會議」(OOPSLA)上發表的一篇文章《數據抽象和層次》(Data Abstraction and Hierarchy)裏提出來的,她提出:繼承必須確保超類所擁有的性質在子類中仍然成立測試
里氏替換原則的做用spa
里氏替換原則是實現開閉原則的重要方式之一。設計
它克服了繼承中重寫父類形成的可複用性變差的缺點,由於它推崇,子類能夠新增方法,可是不要去覆蓋父類已經寫好的方法orm
它是動做正確性的保證,即類的擴展不會給已有的系統引入新的錯誤。下降了代碼出錯的可能性。由於裏式替換原則保證了子類不要去覆蓋父類方法,所以,新增新的子類時。父類定義的東西不會改變。也就是說,進行功能擴展時,原有的代碼不會出錯對象
裏式替換原則的實現方法blog
裏式替換原則通俗來說就是:子類能夠擴展父類的功能,但不能改變父類原有的功能。也就是說,子類繼承父類時,除添加新的方法完成新增功能外,儘可能不要重寫父類已經實現的方法。繼承
若是經過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,可是整個繼承體系的可複用性會比較差,特別是用多態用的比較頻繁時,程序出錯的機率就會變大。由於子類重寫畢竟覆蓋了父類的功能,當須要使用父類的功能時,就容易致使出錯。並且,里氏替換和多態並不衝突,咱們儘可能在抽象類或者接口來作多態,簡單父類通常只是用來自下而上的封裝公有域。接口
若是程序違背了裏式替換原則,則繼承類的對象在基類出現的地方會出現運行錯誤。由於子類重寫了方法,那麼本來爲基類的地方就不必定能用子類來代替了ip
下面以「幾維鳥不是鳥」爲例來講明裏氏替換原則。
【例2】里氏替換原則在「幾維鳥不是鳥」實例中的應用。
分析:鳥通常都會飛行,如燕子的飛行速度大概是每小時 120 公里。可是新西蘭的幾維鳥因爲翅膀退化沒法飛行。假如要設計一個實例,計算這兩種鳥飛行 300 公里要花費的時間。顯然,拿燕子來測試這段代碼,結果正確,能計算出所須要的時間;但拿幾維鳥來測試,結果會發生「除零異常」或是「無窮大」,明顯不符合預期,其類圖如圖 1 所示。
程序代碼以下:
程序的運行結果以下:
若是飛行300千米: 燕子將飛行2.5小時. 幾維鳥將飛行Infinity小時。
程序運行錯誤的緣由是:幾維鳥類重寫了鳥類的 setSpeed(double speed) 方法,這違背了里氏替換原則。正確的作法是:取消幾維鳥原來的繼承關係,定義鳥和幾維鳥的更通常的父類,如動物類,它們都有奔跑的能力。幾維鳥的飛行速度雖然爲 0,但奔跑速度不爲 0,能夠計算出其奔跑 300 公里所要花費的時間。其類圖如圖 2 所示。