




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、里氏替換原則Liskov Substitution Principle, LSP 第4組名字的由來名字的由來(Liskov Substitution Principle, LSP)里氏代換原則以Barbara Liskov(芭芭拉利斯科夫)教授的姓氏命名。最早是在1988年,由麻省理工學(xué)院的女教授(芭芭拉利斯科夫)提出來的。芭芭拉利斯科夫:美國計(jì)算機(jī)科學(xué)家,2008年圖靈獎得主,2004年約翰馮諾依曼獎得主,美國工程院院士,美國藝術(shù)與科學(xué)院院士,美國計(jì)算機(jī)協(xié)會會士,麻省理工學(xué)院電子電氣與計(jì)算機(jī)科學(xué)系教授,美國第一位計(jì)算機(jī)科學(xué)女博士。目錄繼承的弊端2431 里氏替換原則的定義 里氏替換原則包含的
2、 含義使用該原則注意事項(xiàng)一、繼承的弊端 繼承作為面向?qū)ο笕筇匦灾?,在給程序設(shè)計(jì)帶 來巨大便利的同時(shí),也帶來了弊端。例如:1、繼承是侵入性的。只要繼承,就必須擁有父類的所有屬性和方法;2、降低代碼的靈活性。子類必須擁有父類的屬性和方法,讓子類自由的世界中多了些約束;3、增強(qiáng)了耦合性。當(dāng)父類的常量、變量和方法被修改時(shí),必需要考慮子類的修改,而且在缺乏規(guī)范的環(huán)境下,這種修改可能帶來非常糟糕的結(jié)果大片的代碼需要重構(gòu)。一、繼承的弊端問題:怎樣才能讓繼承機(jī)制的“利”大于“弊”? 引入里氏替換原則二、里氏替換原則的定義1、里氏替換原則通俗的來講就是:子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能。子類
3、父類擴(kuò)展功能改變功能二、里氏替換原則的定義2、里氏代換原則告訴我們,在軟件中將一個(gè)基類對象替換成它的子類對象,程序?qū)⒉粫a(chǎn)生任何錯誤和異常,反過來則不成立,如果一個(gè)軟件實(shí)體使用的是一個(gè)子類對象的話,那么它不一定能夠使用基類對象。JAVA中:基類稱為父類 , 導(dǎo)出類稱為子類二、里氏替換原則的定義3、里氏代換原則是實(shí)現(xiàn)開閉原則的重要方式之一,由于使用基類對象的地方都可以使用子類對象,因此在程序中盡量使用基類類型來對對象進(jìn)行定義,而在運(yùn)行時(shí)再確定其子類類型,用子類對象來替換父類對象。三、里氏替換原則包含的含義1、子類可以實(shí)現(xiàn)父類的抽象方法,但是不能覆蓋父類的非抽象方法 在我們做系統(tǒng)設(shè)計(jì)時(shí),經(jīng)常會設(shè)計(jì)
4、接口或抽象類,然后由子類來實(shí)現(xiàn)抽象方法,這里使用的其實(shí)就是里氏替換原則。子類可以實(shí)現(xiàn)父類的抽象方法很好理解,事實(shí)上,子類也必須完全實(shí)現(xiàn)父類的抽象方法,哪怕寫一個(gè)空方法,否則會編譯報(bào)錯。三、里氏替換原則包含的含義 里氏替換原則的關(guān)鍵點(diǎn)在于不能覆蓋父類的非抽象方法。 父類中凡是已經(jīng)實(shí)現(xiàn)好的方法,實(shí)際上是在設(shè)定一系列的規(guī)范和契約,雖然它不強(qiáng)制要求所有的子類必須遵從這些規(guī)范,但是如果子類對這些非抽象方法任意修改,就會對整個(gè)繼承體系造成破壞。而里氏替換原則就是表達(dá)了這一層含義。三、里氏替換原則包含的含義 在面向?qū)ο蟮脑O(shè)計(jì)思想中,繼承這一特性為系統(tǒng)的設(shè)計(jì)帶來了極大的便利性,但是由之而來的也潛在著一些風(fēng)險(xiǎn)。
5、所以,子類C1繼承父類C時(shí),可以添加新方法完成新增功能,盡量不要重寫父類C的方法。否則可能帶來難以預(yù)料的風(fēng)險(xiǎn)。下面舉例說明:運(yùn)行結(jié)果:2+1=1三、里氏替換原則包含的含義 上面的運(yùn)行結(jié)果明顯是錯誤的。類C1繼承C,后來需要增加新功能,類C1并沒有新寫一個(gè)方法,而是直接重寫了父類C的func方法,違背里氏替換原則,引用父類的地方并不能透明的使用子類的對象,導(dǎo)致運(yùn)行結(jié)果出錯。三、里氏替換原則包含的含義2、子類中可以增加自己特有的方法 在繼承父類屬性和方法的同時(shí),每個(gè)子類也都可以有自己的個(gè)性,在父類的基礎(chǔ)上擴(kuò)展自己的功能。前面其實(shí)已經(jīng)提到,當(dāng)功能擴(kuò)展時(shí),子類盡量不要重寫父類的方法,而是另寫一個(gè)方法,
6、所以對上面的代碼加以更改,使其符合里氏替換原則。如下例所示: 運(yùn)行結(jié)果:2-1=1三、里氏替換原則包含的含義3、當(dāng)子類覆蓋或?qū)崿F(xiàn)父類的方法時(shí),方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松HashMap implements MapMap是接口HashMap 是Map的實(shí)現(xiàn)類三、里氏替換原則包含的含義 運(yùn)行結(jié)果:執(zhí)行父類. 注意Son類的func方法前面是不能加Override注解的,因?yàn)榉駝t會編譯提示報(bào)錯,因?yàn)檫@并不是重寫(Override),而是重載(Overload),因?yàn)榉椒ǖ妮斎雲(yún)?shù)不同。三、里氏替換原則包含的含義4、當(dāng)子類的方法實(shí)現(xiàn)父類的抽象方法時(shí),方法的后置條件(即方
7、法的返回值)要比父類更嚴(yán)格執(zhí)行結(jié)果:h=執(zhí)行子類.HashMap implements MapMap是接口HashMap 是Map的實(shí)現(xiàn)類四、在使用里氏代換原則時(shí)需要注意如下幾個(gè)問題1、子類的所有方法必須在父類中聲明,或子類必須實(shí)現(xiàn)父類中聲明的所有方法。根據(jù)里氏代換原則,為了保證系統(tǒng)的擴(kuò)展性,在程序中通常使用父類來進(jìn)行定義,如果一個(gè)方法只存在子類中,在父類中不提供相應(yīng)的聲明,則無法在以父類定義的對象中使用該方法。四、在使用里氏代換原則時(shí)需要注意如下幾個(gè)問題2、我們在運(yùn)用里氏代換原則時(shí),盡量把父類設(shè)計(jì)為抽象類或者接口,讓子類繼承父類或?qū)崿F(xiàn)父接口,并實(shí)現(xiàn)在父類中聲明的方法,運(yùn)行時(shí),子類實(shí)例替換父類
8、實(shí)例,我們可以很方便地?cái)U(kuò)展系統(tǒng)的功能,同時(shí)無須修改原有子類的代碼,增加新的功能可以通過增加一個(gè)新的子類來實(shí)現(xiàn)。里氏代換原則是開閉原則的具體實(shí)現(xiàn)手段之一。3、在系統(tǒng)設(shè)計(jì)時(shí),遵循里氏替換原則,盡量避免子類重寫父類的方法,可以有效降低代碼出錯的可能性。 在Sunny軟件公司開發(fā)的CRM系統(tǒng)中,客戶(Customer)可以分為VIP客戶(VIPCustomer)和普通客戶(CommonCustomer)兩類,系統(tǒng)需要提供一個(gè)發(fā)送Email的功能,原始設(shè)計(jì)方案如圖1所示:圖1原始結(jié)構(gòu)圖 在對系統(tǒng)進(jìn)行進(jìn)一步分析后發(fā)現(xiàn),無論是普通客戶還是VIP客戶,發(fā)送郵件的過程都是相同的,也就是說兩個(gè)send()方法中的代碼重復(fù),而且在本系統(tǒng)中還將增加新類型的客戶。為了讓系統(tǒng)具有更好的擴(kuò)展性,同時(shí)減少代碼重復(fù),使用里氏代換原則對其進(jìn)行重構(gòu)。 在本實(shí)例中,可以考慮增加一個(gè)新的抽象客戶類Customer,而將CommonCustomer和VIPCustomer類作為其子類,郵件發(fā)送類EmailSender類針對抽象客戶類Customer編程,根據(jù)里氏代換原則,能夠接受基類對象的地方必然能夠接受子類對象
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南京耐磨地坪合同范例
- 公司汽車合同范本
- 勞務(wù)雇傭種菜合同范本
- 農(nóng)商銀行授權(quán)推廣合同范本
- 聲勢在小學(xué)音樂教學(xué)中的應(yīng)用策略
- 賣米合同范本
- 養(yǎng)老機(jī)構(gòu)合同范本
- 單位食堂設(shè)施采購合同范本
- 廠屋出租合同范本
- 2025年青海省安全員考試題庫及答案
- 細(xì)菌群體感應(yīng)系統(tǒng)及其應(yīng)用課件
- 司法鑒定程序通則(試行)
- 內(nèi)襯修復(fù)用HTPO管材企標(biāo)
- 部編教材一年級下冊生字筆順筆畫
- 通達(dá)信指標(biāo)——江恩輪
- 二維火收銀使用手冊
- 神經(jīng)電生理檢查ppt課件
- 管路滑脫風(fēng)險(xiǎn)評估表
- 塑鋼板樁專項(xiàng)施工方案
- EN12680.3中文
- 歐科模塊化風(fēng)冷冷水熱泵機(jī)組報(bào)警代碼和維修步驟
評論
0/150
提交評論