2

スーパークラスShape、SquareとRectangleは2つの子クラスにすることができますが、Squareは4辺が等しい特別な長方形であるため、SquareサブクラスRectangleを持つことができますか?

スーパークラスを使用する場合は常に子クラスに置き換えることができるはずですが、子クラスを使用するとスーパークラスに置き換えることができない場合があるという原則を使用して検討しました。大丈夫そうですが、どういうわけかSquareはRectangleの子にはなれないといつも感じていますか?誰かが私に光を当てることができますか?

4

1 に答える 1

4

あなたはリスコフの置換原則を参照しています

代替可能性は、オブジェクト指向プログラミングの原則です。コンピュータプログラムでは、SがTのサブタイプである場合、タイプTのオブジェクトをタイプSのオブジェクトに置き換えることができます(つまり、タイプSのオブジェクトをタイプTのオブジェクトに置き換えることができます)。そのプログラムの望ましい特性(正確さ、実行されたタスクなど)。

あなたの質問に固有:

LSPに違反する典型的な例は、幅と高さの両方にgetterメソッドとsetterメソッドが存在すると仮定して、Rectangleクラスから派生するSquareクラスです。Squareクラスは、常に幅が高さと等しいと想定しています。長方形が予想されるコンテキストでSquareオブジェクトを使用すると、Squareの寸法を個別に変更できない(または変更すべきではない)ため、予期しない動作が発生する可能性があります。この問題は簡単に修正することはできません。Squareクラスのsetterメソッドを変更して、Square不変条件を保持する(つまり、次元を等しく保つ)ことができる場合、これらのメソッドは、Rectangleセッターの事後条件を弱める(違反する)ことになります。寸法は個別に変更できることを述べます。このようなLSPの違反は、実際には問題になる場合と問題にならない場合があります。LSPに違反するクラスを使用するコードによって実際に期待される事後条件または不変条件によって異なります。ここでの重要な問題は可変性です。SquareとRectangleにgetterメソッドしかない場合(つまり、それらが不変オブジェクトである場合)、LSPの違反は発生しません。

平易な英語では、SquareにはRectangleにはない動作があるため、Rectangleが期待されるSquareは使用できません。誰かがRectangleのインスタンスであると思われるものを使用しようとしているが、それが実際にはSquareのインスタンスである場合、幅を設定し、高さが自動的に変更されることに驚かれる可能性があります(予期しない副作用)。

于 2012-07-12T04:29:11.863 に答える