物件應該可以替換為其子類型,而不影響程式碼的正確性
讓我們用繼承來理解這一點(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中文網其他相關文章!