1

LSP とその違反の概要を理解できました。たとえば、setWidth() および setHeight() 関数を持つ Rectangle を正方形で拡張することは、追加の要件があるため、LSP の微妙な違反です。同様に、関数 something(Grass g) で Duck クラスを拡張する GreenDuck には、草が緑であることを要求する余分な節があってはなりません。

正方形と長方形のシナリオでは、多角形インターフェイスと、長方形と多角形を独自の方法で実装する正方形クラスを実装するのが正しいと思います。GreenDuck シナリオでは、コンポジションを使用して Duck をフィールドの 1 つとして持つ GreenDuck は良い考えかもしれません。

Q1) 上記の 2 つのシナリオについて、私の理解は正しいですか?

Q2) また、LSP が「拡張」を許可するシナリオをモデル化することができないため、質問に至りました。誰かが LSP を掘り下げて、extend が適切であり、構成がそれほど良くない場合にボーナスとなる特定の例を提供できますか?

編集:明確にするために

4

1 に答える 1

3

Liskov のコンテキストでは、検査インターフェースと変更インターフェースを区別することが重要です。正方形は、長方形のように高さと幅を取得できるという意味で、長方形です。高さと幅を別々に設定できないという点で、長方形とは異なります。したがって、「ポリゴン インターフェイスを実装するのが正しい」ということで、関数Rectangleが必要であることを意味する場合は、それで問題ありません。getPolygonVerticesしかし、それが持つインターフェイスを実装する必要があることを意味する場合は、 likeを持つことができないsetPolygonVerticesのと同じ理由で、それは間違っています。SquaresetHeightAndWidthRectangle

メンバーがGreenDuckいるDuckということは……えぇ……ちょっと変ですよね。一般的にアヒルの中に他のアヒルがいるのですか?

于 2014-10-29T20:36:39.540 に答える