隨筆-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
          請問博主:
          如果鴕鳥類繼承了鳥類,鳥類會飛,那么鴕鳥類也會飛了,但實際上鴕鳥類是不會飛的,只是能奔跑的很快。

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

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


          網站導航:
           
          主站蜘蛛池模板: 平谷区| 军事| 同心县| 常山县| 忻州市| 高台县| 四平市| 红安县| 广安市| 吴堡县| 绿春县| 巴中市| 永川市| 琼结县| 叶城县| 紫云| 文山县| 美姑县| 平乐县| 海安县| 九龙城区| 民和| 潼南县| 伊春市| 临泽县| 荥经县| 灵石县| 富顺县| 勃利县| 汝城县| 大兴区| 上高县| 彭州市| 安康市| 吉林市| 淮南市| 上虞市| 苍山县| 丘北县| 长武县| 金昌市|