Cormacには本当に素晴らしい答えがありますが、そもそも混乱の理由について少し詳しく説明したいと思います。
オブジェクト指向の継承は、「リンゴとオレンジはどちらも果物のサブクラスである」などの現実世界のメタファーを使用して教えられることがよくあります。残念ながら、これはオブジェクト指向の型はプログラムとは独立して存在するいくつかの分類階層に従ってモデル化されるべきであるという誤った信念につながります。
ただし、ソフトウェア設計では、アプリケーションの要件に従って型をモデル化する必要があります。通常、他のドメインの分類は無関係です。「Apple」および「Orange」オブジェクト(スーパーマーケットの在庫管理システムなど)を使用する実際のアプリケーションでは、これらはおそらくまったく別個のクラスではなく、「Fruit」などのカテゴリはスーパータイプではなく属性になります。
楕円の問題は赤いニシンです。ジオメトリでは、円は楕円の特殊化ですが、例のクラスは幾何学的な数字ではありません。重要なのは、幾何学的図形は変更できないことです。ただし、それらは変換できますが、円は省略記号に変換できます。そのため、円は半径を変更できるが省略記号は変更できないモデルは、ジオメトリに対応していません。このようなモデルは特定のアプリケーション(描画ツールなど)で意味をなす場合がありますが、クラス階層の設計方法には幾何学的分類は関係ありません。
だから、CircleはEllipseのサブクラスである必要がありますか?これらのオブジェクトを使用する特定のアプリケーションの要件に完全に依存します。描画アプリケーションには、円と楕円の処理方法にさまざまな選択肢があります。
円と楕円を異なるUIを持つ異なるタイプの形状として扱います(たとえば、省略記号に2つのサイズ変更ハンドル、円に1つのハンドル)。これは、アプリケーションの観点から、幾何学的に円であるが円ではない楕円を使用できることを意味します。
円を含むすべての楕円を同じように扱いますが、xとyを同じ値に「ロック」するオプションがあります。
楕円は、スケーリング変換が適用された単なる円です。
可能な設計ごとに異なるオブジェクトモデルが作成されます-
最初のケースでは、CircleとEllipsesは兄弟クラスになります
2番目のクラスでは、明確なCircleクラスはまったくありません。
3番目のクラスでは、明確なEllipseクラスはありません。そのため、いわゆる円楕円問題は、これらのいずれにも写り込みません。
それで、提起された質問に答えるために:円は楕円を拡張するべきですか?答えは次のとおりです。何をしたいかによって異なります。しかし、おそらくそうではありません。