Cormac tiene una respuesta realmente excelente, pero solo quiero explicar un poco sobre la razón de la confusión en primer lugar.
La herencia en OO a menudo se enseña utilizando metáforas del mundo real, como "las manzanas y las naranjas son subclases de fruta". Desafortunadamente, esto lleva a la creencia errónea de que los tipos en OO deben modelarse de acuerdo con algunas jerarquías taxonómicas existentes independientemente del programa.
Pero en el diseño de software, los tipos deben modelarse de acuerdo con los requisitos de la aplicación. Las clasificaciones en otros dominios suelen ser irrelevantes. En una aplicación real con objetos "Apple" y "Orange", digamos un sistema de gestión de inventario para un supermercado, probablemente no serán clases distintas, y categorías como "Fruta" serán atributos en lugar de supertipos.
El problema del círculo-elipse es un arenque rojo. En geometría, un círculo es una especialización de una elipse, pero las clases en su ejemplo no son figuras geométricas. Crucialmente, las figuras geométricas no son mutables. Sin embargo, pueden transformarse , pero luego un círculo puede transformarse en puntos suspensivos. Por lo tanto, un modelo donde los círculos pueden cambiar el radio pero no cambiar a puntos suspensivos no corresponde a la geometría. Tal modelo podría tener sentido en una aplicación particular (digamos una herramienta de dibujo) pero la clasificación geométrica es irrelevante para la forma en que diseña la jerarquía de clases.
Entonces, ¿debería ser Circle una subclase de Ellipse o viceversa? Depende totalmente de los requisitos de la aplicación particular que utiliza estos objetos. Una aplicación de dibujo podría tener diferentes opciones sobre cómo tratar círculos y elipses:
Trate los círculos y las elipses como distintos tipos de formas con diferentes IU (p. Ej., Dos controles de cambio de tamaño en puntos suspensivos, un control en un círculo). Esto significa que puede tener una elipse que es geométricamente un círculo pero no un círculo desde la perspectiva de la aplicación.
Trate todas las elipses, incluidos los círculos, de la misma manera, pero tenga la opción de "bloquear" x e y con el mismo valor.
Las elipses son solo círculos donde se aplica una transformación de escala.
Cada posible diseño conducirá a un modelo de objeto diferente:
En el primer caso, Circle y Ellipses serán clases entre hermanos.
En la segunda, no habrá una clase de círculo distinta.
En el tercero, no habrá una clase de Elipse distinta. Entonces, el llamado problema círculo-elipse no entra en la imagen en ninguno de estos.
Entonces, para responder la pregunta planteada: ¿Debería el círculo extender la elipse? La respuesta es: depende de lo que quieras hacer con él. Pero probablemente no.