国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

一些面向對象的設計法則(4)

2019-11-18 11:55:30
字體:
來源:轉載
供稿:網友

  法則4:Liskov替換法則(LSP)
  
  使用指向基類(超類)的引用的函數,必須能夠在不知道具體派生類(子類)對象類型的情況下使用它們。
  
  [ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects
  Of Derived(Sub) Classes Without Knowing It ]
  
  
  
  
  
  
  
  
  Liskov替換法則
  
  
  
  
  
  
  1.顯而易見,Liskov替換法則(LSP)是根據我所熟知的"多態"而得出的。
  
  2.例如:
  
  
  
  方法drawShape應該可與Sharp超類的任何子類一起工作(或者,若Sharp為java接口,則該方法可與任何實現了Sharp接口的類一起工作)
  
  但是當我們在實現子類時必須要謹慎對待,以確保我們不會無意中違反了LSP。
  
  
  
  
  
  
  
  
  3.若一個函數未能滿足LSP,那么可能是因為它顯式地引用了超類的一些或所有子類。這樣的函數也違反了OCP,因為當我們創建一個新的子類時,會不得不進行代碼的修改。
  
  
  
  
  
  
  
  
  
  LSP示例
  
  
  
  
  
  
  1. 考慮下面Rectangle類:
  
   一些面向對象的設計法則(4)(圖一)
  
  2.現在,Square類會如何呢?顯然,一個正方形是一個四邊形,因此Square類應該從Rectangle類派生而來,對否?讓我們看一看!
  
  3.觀察可得:
  
  a.正方形不需要將高和寬都作為屬性,但是總之它將繼續自Rectangle。因此,每一個Square對象會浪費一點內存,但這并不是一個主要問題。
  
  b.繼續而來的setWidth()和setHeight()方法對于Square而言并非真正地適合,因為一個正方形的高和寬是相同。因此我們將需要重寫setWidth()和setHeight()方法。不得不重寫這些簡單的方法有可能是一種不恰當的繼續使用方式。
  
  
  
  3.Square類如下:
  
   一些面向對象的設計法則(4)(圖二)
  
  4. 看起來都還不錯。但是讓我們檢驗一下!
  
   一些面向對象的設計法則(4)(圖三)
  
   一些面向對象的設計法則(4)(圖四)
  
  5. 測試程序輸出:
  
  一些面向對象的設計法則(4)(圖五)
  
  6.看上去似乎我們違反了LSP!
  
  
  
  7.這里的問題出在哪里呢?編寫testLsp()方法的程序員做了一個合理的假設,即改變Rectangle的寬而保持它的高不變。
  
  8.在將一個Square對象傳遞給這樣一個方法時產生了問題,顯然是違反了LSP
  
  9.Square和Rectangle類是相互一致和合法的。盡管程序員對基類作了合理的假設,但其所編寫的方法仍然會導致設計模型的失敗。
  
  10.不能孤立地去看待解決方案,必須根據設計用戶所做的合理假設來看待它們。
  
  
  
  11. 一個數學意義上的正方形可能是一個四邊形,但是一個Square對象不是一個Rectangle對象,因為一個Square對象的行為與一個Rectangle對象的行為是不一致的!
  
  12.從行為上來說,一個Square不是一個Rectangle!一個Square對象與一個Rectangle對象之間不具有多態的特征。
  
  
  
  
  
  
  
  
  
  
  
  
  
  總結
  
  
  
  
  
  
  1.Liskov替換法則(LSP)清楚地表明了ISA關系全部都是與行為有關的。
  
  2.為了保持LSP(并與開放-封閉法則一起),所有子類必須符合使用基類的client所期望的行為。
  
  3.一個子類型不得具有比基類型(base type)更多的限制,可能這對于基類型來說是合法的,但是可能會因為違反子類型的其中一個額外限制,從而違反了LSP!
  
  4.LSP保證一個子類總是能夠被用在其基類可以出現的地方!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 太仆寺旗| 东莞市| 老河口市| 兴文县| 盐城市| 五峰| 北宁市| 瑞丽市| 新昌县| 望谟县| 勐海县| 商南县| 武功县| 无棣县| 高密市| 潜山县| 琼中| 雷州市| 常宁市| 古交市| 云南省| 长治市| 菏泽市| 洪湖市| 威信县| 凭祥市| 论坛| 固阳县| 金门县| 兴国县| 佛山市| 汶上县| 安平县| 海淀区| 内黄县| 尼勒克县| 聂拉木县| 榆社县| 巴林左旗| 项城市| 井研县|