隨筆-126  評論-247  文章-5  trackbacks-0

          里氏代換原則LiskovSubstitution Principle,簡稱LSP)說的是:一個軟件實體如果使用的是一個基類的話,那么一定適用于其子類,而且它根本不能夠察覺出基類對象

          和子類對象的區別。
          也就是說,在軟件實體里面,把父類都換成其子類,程序的行為是不會發生變化的。

          里氏代換原則LSP):子類型必須能替換掉它的父類型,反過來代換原則不成立。

          里氏代換原則是繼承復用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不會受到影響的時候,基類才能真正被復用,而衍生類也才能夠在基類的基礎上添加新的行為。


          一個簡單的例子:現有一個鳥類,一個鴕鳥類,如圖:

          在面向對象程序設計里面,對于鴕鳥類屬不屬于鳥類的問題,換句話說就是,鴕鳥類能不能繼承鳥類的問題,如圖:



          答案的否定的。這貌似有些荒唐,在生物界中,鴕鳥隸屬鳥綱沒有錯,

          但是在程序里面,鴕鳥類不能繼承鳥類,因為根據LSP(里氏代換原則),如果鴕鳥類繼承了鳥類,鳥類會飛,那么鴕鳥類也會飛了,但實際上鴕鳥類是不會飛的,只是能奔跑的很快。

          在 java 語言中,LSP(里氏代換原則)會在編譯期間被檢查,當然,這只是與實現無關的,純語法意義上的檢查,如果某一程序違反了這一原則,java 編譯器在編譯的時候是不會

          讓其通過的,這時就會出現編譯錯誤。

          但事實是,不會飛的鳥和會飛的鳥都屬于鳥綱(生物不好,不知道這樣說正確與否 *_*,不過不影響后面引出的話題),在程序設計里面看來,它們都有許多共性和特征,像這些

          不會飛的鴕鳥、企鵝等和會飛的鳥類,在類的設計上它們的共性體現在屬性和方法上,如果都將不會飛的和會飛的鳥類獨立,這明顯不是一種好的做法,怎么說呢?

          最明顯不過的一個條是,不管會飛的或不會飛的鳥,它們在上都屬于鳥綱,都應該能繼承鳥的一般屬性和行為,從代碼重構的角度來看(糟糕,扯到代碼重構了,不過既然問題

          已經引出,不妨把它解決掉),可以創建一個抽象的類,作為會飛的和不會飛的兩大鳥類的超類,然后就可以將會飛的和不會飛的鳥類的共同行為向上移到超類中,讓超類的子類

          可以通過繼承得到這些行為,從而解決會飛的鳥類和不會飛的鳥類行為不一致的問題。如圖:



            
          posted on 2012-08-02 13:18 fancydeepin 閱讀(889) 評論(1)  編輯  收藏

          評論:
          # re: 里氏代換原則(LSP)[未登錄] 2013-03-15 21:16 | ccc
          請問博主:
          如果鴕鳥類繼承了鳥類,鳥類會飛,那么鴕鳥類也會飛了,但實際上鴕鳥類是不會飛的,只是能奔跑的很快。

          這句話本身有問題,"如果鴕鳥類繼承了鳥類,鳥類會飛,那么鴕鳥類也會飛了",這句話這么推論是正確的,為什么會出現錯誤的結果呢?因為前提弄錯了,鳥類不一定都會飛。  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 景谷| 长葛市| 辽宁省| 克拉玛依市| 黄石市| 吉水县| 富川| 武冈市| 酉阳| 江源县| 凌海市| 余姚市| 陈巴尔虎旗| 富宁县| 南木林县| 望都县| 保德县| 萍乡市| 永城市| 渝中区| 荔波县| 德昌县| 新津县| 武义县| 承德县| 瑞丽市| 鄄城县| 定州市| 保山市| 湖北省| 梁河县| 桐庐县| 桂林市| 务川| 娄底市| 额敏县| 长汀县| 乐至县| 湄潭县| 壤塘县| 武定县|