里氏代換原則(LiskovSubstitution Principle,簡稱LSP)說的是:一個軟件實體如果使用的是一個基類的話,那么一定適用于其子類,而且它根本不能夠察覺出基類對象
和子類對象的區(qū)別。也就是說,在軟件實體里面,把父類都換成其子類,程序的行為是不會發(fā)生變化的。
里氏代換原則(LSP):子類型必須能替換掉它的父類型,反過來代換原則不成立。
里氏代換原則是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不會受到影響的時候,基類才能真正被復(fù)用,而衍生類也才能夠在基類的基礎(chǔ)上添加新的行為。
一個簡單的例子:現(xiàn)有一個鳥類,一個鴕鳥類,如圖:

在面向?qū)ο蟪绦蛟O(shè)計里面,對于鴕鳥類屬不屬于鳥類的問題,換句話說就是,鴕鳥類能不能繼承鳥類的問題,如圖:

答案的否定的。這貌似有些荒唐,在生物界中,鴕鳥隸屬鳥綱沒有錯,
但是在程序里面,鴕鳥類不能繼承鳥類,因為根據(jù)LSP(里氏代換原則),如果鴕鳥類繼承了鳥類,鳥類會飛,那么鴕鳥類也會飛了,但實際上鴕鳥類是不會飛的,只是能奔跑的很快。
在 java 語言中,LSP(里氏代換原則)會在編譯期間被檢查,當(dāng)然,這只是與實現(xiàn)無關(guān)的,純語法意義上的檢查,如果某一程序違反了這一原則,java 編譯器在編譯的時候是不會
讓其通過的,這時就會出現(xiàn)編譯錯誤。
但事實是,不會飛的鳥和會飛的鳥都屬于鳥綱(生物不好,不知道這樣說正確與否 *_*,不過不影響后面引出的話題),在程序設(shè)計里面看來,它們都有許多共性和特征,像這些
不會飛的鴕鳥、企鵝等和會飛的鳥類,在類的設(shè)計上它們的共性體現(xiàn)在屬性和方法上,如果都將不會飛的和會飛的鳥類獨(dú)立,這明顯不是一種好的做法,怎么說呢?
最明顯不過的一個條是,不管會飛的或不會飛的鳥,它們在綱上都屬于鳥綱,都應(yīng)該能繼承鳥的一般屬性和行為,從代碼重構(gòu)的角度來看(糟糕,扯到代碼重構(gòu)了,不過既然問題
已經(jīng)引出,不妨把它解決掉),可以創(chuàng)建一個抽象的類,作為會飛的和不會飛的兩大鳥類的超類,然后就可以將會飛的和不會飛的鳥類的共同行為向上移到超類中,讓超類的子類
可以通過繼承得到這些行為,從而解決會飛的鳥類和不會飛的鳥類行為不一致的問題。如圖:

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