里氏替換原則是面向對象設計的基本原則之一,主張使用“抽象(Abstraction)”和“多態(tài)(Polymorphism)”將設計中的靜態(tài)結構改為動態(tài)結構,維持設計的封閉性。“抽象”是語言提供的功能,“多態(tài)”由繼承語義實現。
南皮網站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、響應式網站開發(fā)等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯(lián)建站。
里氏替換原則(Liskov Substitution Principle,LSP)由麻省理工學院計算機科學實驗室的里斯科夫(Liskov)女士在 1987 年的“面向對象技術的高峰會議”(OOPSLA)上發(fā)表的一篇文章《數據抽象和層次》(Data Abstraction and Hierarchy)里提出來的,她提出:繼承必須確保超類所擁有的性質在子類中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。
里氏替換原則主要闡述了有關繼承的一些原則,也就是什么時候應該使用繼承,什么時候不應該使用繼承,以及其中蘊含的原理。里氏替換原是繼承復用的基礎,它反映了基類與子類之間的關系,是對開閉原則的補充,是對實現抽象化的具體步驟的規(guī)范。
里氏替換原則的作用
里氏替換原則的主要作用如下。
1、里氏替換原則是實現開閉原則的重要方式之一。
2、它克服了繼承中重寫父類造成的可復用性變差的缺點。
3、它是動作正確性的保證。即類的擴展不會給已有的系統(tǒng)引入新的錯誤,降低了代碼出錯的可能性。
里氏替換原則的實現方法
里氏替換原則通俗來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。也就是說:子類繼承父類時,除添加新的方法完成新增功能外,盡量不要重寫父類的方法。
如果通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的可復用性會比較差,特別是運用多態(tài)比較頻繁時,程序運行出錯的概率會非常大。
如果程序違背了里氏替換原則,則繼承類的對象在基類出現的地方會出現運行錯誤。這時其修正方法是:取消原來的繼承關系,重新設計它們之間的關系。
關于里氏替換原則的例子,最有名的是“正方形不是長方形”。當然,生活中也有很多類似的例子,例如,企鵝、鴕鳥和幾維鳥從生物學的角度來劃分,它們屬于鳥類;但從類的繼承關系來看,由于它們不能繼承“鳥”會飛的功能,所以它們不能定義成“鳥”的子類。同樣,由于“氣球魚”不會游泳,所以不能定義成“魚”的子類;“玩具炮”炸不了敵人,所以不能定義成“炮”的子類等。
下面以“幾維鳥不是鳥”為例來說明里氏替換原則。
【例2】里氏替換原則在“幾維鳥不是鳥”實例中的應用。
分析:鳥一般都會飛行,如燕子的飛行速度大概是每小時 120 千米。但是新西蘭的幾維鳥由于翅膀退化無法飛行。假如要設計一個實例,計算這兩種鳥飛行 300 千米要花費的時間。顯然,拿燕子來測試這段代碼,結果正確,能計算出所需要的時間;但拿幾維鳥來測試,結果會發(fā)生“除零異常”或是“無窮大”,明顯不符合預期,其類圖如圖 1 所示。
程序代碼如下:
package principle; public class LSPtest { public static void main(String[] args) { Bird bird1=new Swallow(); Bird bird2=new BrownKiwi(); bird1.setSpeed(120); bird2.setSpeed(120); System.out.println("如果飛行300公里:"); try { System.out.println("燕子將飛行"+bird1.getFlyTime(300)+"小時."); System.out.println("幾維鳥將飛行"+bird2.getFlyTime(300)+"小時。"); } catch(Exception err) { System.out.println("發(fā)生錯誤了!"); } } } //鳥類 class Bird { double flySpeed; public void setSpeed(double speed) { flySpeed=speed; } public double getFlyTime(double distance) { return(distance/flySpeed); } } //燕子類 class Swallow extends Bird{} //幾維鳥類 class BrownKiwi extends Bird { public void setSpeed(double speed) { flySpeed=0; } }
程序的運行結果如下:
如果飛行300公里: 燕子將飛行2.5小時. 幾維鳥將飛行Infinity小時。
程序運行錯誤的原因是:幾維鳥類重寫了鳥類的 setSpeed(double speed) 方法,這違背了里氏替換原則。正確的做法是:取消幾維鳥原來的繼承關系,定義鳥和幾維鳥的更一般的父類,如動物類,它們都有奔跑的能力。幾維鳥的飛行速度雖然為 0,但奔跑速度不為 0,可以計算出其奔跑 300 千米所要花費的時間。
其類圖如圖 2 所示。
更多相關知識,請訪問:PHP中文網!
新聞名稱:里氏替換原則是什么?
文章起源:http://vcdvsql.cn/article38/chcppp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供自適應網站、網站維護、Google、商城網站、云服務器、網站設計公司
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)