Cormac ha una risposta davvero grandiosa, ma voglio solo approfondire un po 'il motivo della confusione in primo luogo.
L'ereditarietà nell'OO viene spesso insegnata usando metafore del mondo reale, come "mele e arance sono entrambe sottoclassi di frutta". Sfortunatamente questo porta all'errata convinzione che i tipi in OO dovrebbero essere modellati secondo alcune gerarchie tassonomiche esistenti indipendentemente dal programma.
Ma nella progettazione del software, i tipi dovrebbero essere modellati in base ai requisiti dell'applicazione. Le classificazioni in altri domini sono generalmente irrilevanti. In una vera applicazione con oggetti "Apple" e "Orange" - diciamo un sistema di gestione dell'inventario per un supermercato - probabilmente non saranno affatto classi distinte e categorie come "Fruit" saranno attributi piuttosto che supertipi.
Il problema dell'ellisse circolare è un'aringa rossa. In geometria un cerchio è una specializzazione di un'ellisse, ma le classi nel tuo esempio non sono figure geometriche. Fondamentalmente, le figure geometriche non sono mutabili. Tuttavia, possono essere trasformati , ma poi un cerchio può essere trasformato in ellissi. Quindi un modello in cui i cerchi possono cambiare raggio ma non passare a un'ellissi non corrisponde alla geometria. Un tale modello potrebbe avere senso in una particolare applicazione (ad esempio uno strumento di disegno) ma la classificazione geometrica è irrilevante per il modo in cui si progetta la gerarchia di classi.
Quindi Circle dovrebbe essere una sottoclasse di Ellipse o viceversa? Dipende totalmente dai requisiti della particolare applicazione che utilizza questi oggetti. Un'applicazione di disegno potrebbe avere diverse opzioni su come trattare cerchi ed ellissi:
Tratta cerchi ed ellissi come tipi distinti di forme con UI diversa (es. Due maniglie di ridimensionamento su un'ellissi, una su un cerchio). Ciò significa che puoi avere un'ellisse che è geometricamente un cerchio ma non un cerchio dal punto di vista dell'applicazione.
Tratta tutte le ellissi compresi i cerchi allo stesso modo, ma ha un'opzione per "bloccare" xey sullo stesso valore.
Le ellissi sono solo cerchi in cui è stata applicata una trasformazione in scala.
Ogni possibile progetto porterà a diversi modelli di oggetti -
Nel primo caso, Circle e ellissi sarà pari livello classi
Nel secondo, non ci sarà affatto una classe Circle distinta
Nel terzo, non ci sarà una classe Ellipse distinta. Quindi il cosiddetto problema dell'ellisse circolare non entra nell'immagine in nessuno di questi.
Quindi, per rispondere alla domanda come posta: il cerchio dovrebbe estendere l'ellisse? La risposta è: dipende da cosa vuoi farci. Ma probabilmente no.