首頁> Java> java教程> 主體

里氏替換原則

PHPz
發布: 2024-08-25 22:30:36
原創
949 人瀏覽過

Liskov Substitution Principle

物件應該可以替換為其子類型,而不影響程式碼的正確性

讓我們用繼承來理解這一點(Is-a關係)
例如:鴕鳥是鳥,駝背是汽車等等

範例:賽車是一輛車

雷雷 雷雷

RacingCar 覆蓋了汽車類的getCabinWidth() 但保留它未實現因為賽車沒有駕駛室寬度(如果你看到一輛一級方程式賽車,它沒有任何內部空間,它只有一個駕駛員所在的駕駛艙)
因此賽車的內部空間稱為駕駛艙。
注意:賽車有一些規格可能與通用汽車不匹配

雷雷

這是一個已經曝光的設計,因為 for 迴圈在第三次迭代時會失敗。
為了解決這個問題,我們必須從根源解決,那就是繼承本身。


解 1 :(打破層次結構

我們必須打破繼承,相反,我們將為 Car 和 RacingCar 提供一個共同的父對象

我們將創建一個非常通用的父類,名為 Vehicle

雷雷 雷雷 雷雷 雷雷

**打破層次結構:如果替換失敗,則打破層次結構


解決方案2:告訴不要問

我們再舉一個亞馬遜的例子
亞馬遜為所有第三方產品提供 x 折扣。
並對所有自營產品提供1.5倍x優惠(Amazon Basics產品均為亞馬遜自營產品)

雷雷 雷雷 雷雷

請注意,if 語句涉及更新InHouseProduct 的折扣金額,這違反了里氏替換原則(因為我們應該能夠將對象Product 替換為其子類型InHouseProduct),但在if 語句中我們手動更新不應該做的折扣金額。

對 InHouseProduct 類別進行輕微修改即可解決此問題

雷雷

最後從 PricingUtils 類別中刪除 if 語句

雷雷

告訴不要問:這裡我們告訴 utils 類別列印所有折扣,並且 utils 類別不必詢問任何內容(因為它之前透過 if 語句詢問)


以上是里氏替換原則的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!