オブジェクトは、コードの正確さに影響を与えることなく、そのサブタイプに置き換え可能である必要があります
これを継承(Is-a関係)で理解しましょう
例: ダチョウは鳥、せむしは車など
例: レーシングカーは車です
RacingCar は車クラスの getCabinWidth() をオーバーライドしますが、それを未実装のままにします。なぜなら、レーシング カーにはキャビン幅がないからです (F1 レーシング カーを見ると、内部スペースはありません。あるのは、ドライバーが座るコックピット)
したがって、レーシングカーの室内空間はコックピットと呼ばれます。
注: レーシングカーには、一般的な車と一致しない仕様がある可能性があります
for ループは 3 回目の反復で失敗するため、これは公開されたデザインです。
これを修正するには、継承そのものである根本を攻撃する必要があります。
解決策 1 : (階層の破壊)
継承を解除する必要があります。代わりに、Car と RacingCar の両方に共通の親を考え出します
Vehicle という非常に汎用的な親クラスを作成します
**階層の破壊: 置換が失敗した場合は階層を破壊します
解決策 2:聞かないで教えてください
Amazon の別の例を見てみましょう
Amazon では、すべてのサードパーティ製品に対して x 額の割引を提供しています。
すべての自社製品を 1.5 倍提供します (Amazon ベーシック製品は Amazon の自社製品です)
if ステートメントは、リスコフ置換原則に反しています(オブジェクト Product をそのサブタイプ InHouseProduct に置き換えることができるはずなので)、InHouseProduct の割引額の更新に関与していることに注意してください。ただし、ここでの if ステートメントでは、手動でしてはいけない割引額の更新
InHouseProduct クラスを少し変更すると、この問題が解決されます
そして最後に、PricingUtils クラスから if ステートメントを削除します
尋ねないでください: ここでは、utils クラスにすべての割引を出力するように指示しています。utils クラスは何も尋ねる必要はありません (以前 if ステートメントで尋ねていたように)
以上がリスコフ置換原理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。