LSP とその違反の概要を理解できました。たとえば、setWidth() および setHeight() 関数を持つ Rectangle を正方形で拡張することは、追加の要件があるため、LSP の微妙な違反です。同様に、関数 something(Grass g) で Duck クラスを拡張する GreenDuck には、草が緑であることを要求する余分な節があってはなりません。
正方形と長方形のシナリオでは、多角形インターフェイスと、長方形と多角形を独自の方法で実装する正方形クラスを実装するのが正しいと思います。GreenDuck シナリオでは、コンポジションを使用して Duck をフィールドの 1 つとして持つ GreenDuck は良い考えかもしれません。
Q1) 上記の 2 つのシナリオについて、私の理解は正しいですか?
Q2) また、LSP が「拡張」を許可するシナリオをモデル化することができないため、質問に至りました。誰かが LSP を掘り下げて、extend が適切であり、構成がそれほど良くない場合にボーナスとなる特定の例を提供できますか?
編集:明確にするために