「四角形から継承する四角形」のパラドックスに特定の名前はありますか?


18

OOPの特定の失敗は、Rectangleを継承するクラスSquareで示されます。論理的には、SquareはRectangleの特殊化であるため、Rectangleから継承する必要がありますが、Squareの長さまたは幅を変更しようとすると、すべてがバラバラになります。

そのケースで何が問題になっているのかを説明する特定の用語はありますか?


2
「間違っている」と正確に説明してください。私はあなたが何を意味するか理解していない
ブヨ

1
長方形に長さと幅を渡すことでサイズを設定できる仮想メソッドがあると仮定すると、正方形に異なる長さと幅を設定すると長方形が返され、長方形に同じ長さと幅を設定すると正方形が返されます。正方形を明示的に知る必要があるコードは、正方形へのキャストを試みることができます。私は...障害があるか表示されない

8
これはパラドックスではありません。これは、問題領域の不適切なモデリングの場合です。継承階層は、必ずしも問題ドメイン内のモノの階層と一致するとは限りません。それは良いことですが、優れたモデルの秘trickは、現実世界とは異なる方法で物事を行う必要がある場所を理解することです。
マイケルコーン

1
FWIW:より具体的には、問題は読み取りインターフェイスと書き込みインターフェイスが一致しないことです。つまり、円を楕円の特殊化として読み取ることができますが、楕円を円の特殊化としてのみ書き込むことができます。
マッケ

1
@GrandmasterB私は、「明らかに矛盾した性質を示す人、物、または状況」で行きます。矛盾は、正方形のプロパティが異なる場合、「正方形は長方形の一種ではない」と言わなければならないということです。実際には、正方形は長方形のサブタイプであると予想されます。おそらく、実際のアプリケーションにはRectangle型とSquare型はありません。これは、クラスベースのパラダイムに現れる可能性がある特定の種類の問題を説明するための単なる抽象化です。
ビクター

回答:


27

ウィキペディアは単にそれを円楕円問題と呼んでいます

円楕円問題(時々として知られているソフトウェア開発における正方形長方形の問題は)オブジェクトモデルでサブタイプの多型を使用する場合に発生する可能性が落とし穴の数を示します。問題は、オブジェクト指向プログラミングを使用するときに最もよく発生します。

これは、リスコフ置換原理として知られる頭字語SOLIDの L です。この問題は、その原則の違反として発生します。

問題は、円と楕円(または同様に、正方形と長方形)を表すクラス間にどのサブタイプまたは継承関係が存在するかに関するものです。より一般的には、派生クラスで見つかった(より強力な)不変式を無効にする方法でオブジェクトを変更するメソッドが基本クラスに含まれている場合に発生する可能性のある問題を示しています。


1
そして、それを読んで、ウィキペディアは「アカデミックな説明」を「リスコフ代替原理」として言及しています。ありがとう:)
ビクター

1
まあ、それはあなたがそれをどのように見るかに依存する違反です。個人的には、すべての円は楕円です。違反はありません。楕円の方法が制限的になった場合、違反が発生し始めます。次に、その特定のシナリオでは、円をその楕円の特定のコントラクトのサブタイプにすることはできません。
マークカンラス

6
@MarkCanlasこの問題は、間違いなくリスコフ代替原理の違反です。他の原則に違反していないかもしれませんが、誰もそれを主張していません。契約に壊れる不変式が含まれていないために問題が発生しない場合(これが真実である有用なモデルを想像することはできませんが)、LSPの違反はないかもしれませんが、それは、問題が発生した場合、LSP違反ではありません。

7
@Mark Canlas:いや、一定の円は一定の楕円であり、可変の円は可変の楕円ではありません。ジオメトリが一定であると想定されている場合、楕円を変更することはできません。別の楕円を取ることができます
maxim1000

1
Liskov Substitution PrincipleのHistory Constraint / Ruleは、サブタイプが新しいメソッドを追加すると、それらのメソッドは、オブジェクトの状態を操作することはできません。スーパータイプで許可されます。たとえば、スーパータイプのメソッドを介してのみ操作される場合、状態は常に同じであるのに対し、サブタイプのミューテーターメソッドを介して操作される場合、状態は変化するため、不変の可変のサブタイプを作成することはできません。これは、スーパータイプでは許可されていない履歴です。
ヨルグWミットタグ


8

Liskov Substitution Principleよりも基本的なレベルでは、これはカテゴリエラーまたはカテゴリミスです。

モデリング動作コンテキストでは、正方形は単に長方形のタイプではありません。

これに気付くと、最初の仮定(正方形は長方形の一種)がプレイから削除されるため、問題は解消されます。

この答えの問題は、学校から幾何学をしている誰にでも掘り下げられることで、正方形は長方形の一種であるということです。ただし、これは非常に特定のコンテキスト(内部角度のプロパティに基づく幾何学的形状の分類)でのみ当てはまることを理解することが非常に重要です。動作に関しては、正方形は長方形ではありません。間違ったコンテキストで分類の1つのセットを表示することは、カテゴリの間違いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.