Cormac ha una risposta davvero fantastica, ma voglio solo approfondire un po 'il motivo della confusione, in primo luogo.
L'ereditarietà in OO viene spesso insegnata usando metafore del mondo reale, come "le mele e le arance sono entrambe sotto-classi di frutta". Sfortunatamente ciò porta a credere erroneamente che i tipi in OO dovrebbero essere modellati in base ad alcune gerarchie tassonomiche esistenti indipendenti dal programma.
Ma nella progettazione del software, i tipi dovrebbero essere modellati in base ai requisiti dell'applicazione. Classificazioni in altri domini sono di solito irrilevanti. In un'applicazione reale con oggetti "Apple" e "Orange" - ad esempio un sistema di gestione dell'inventario per un supermercato - probabilmente non saranno affatto classi distinte e categorie come "Frutta" 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. Possono essere trasformati , tuttavia, ma una può essere trasformata in un'ellissi. Quindi un modello in cui i cerchi possono cambiare raggio ma non cambiare in un'ellissi non corrisponde alla geometria. Un modello del genere potrebbe avere senso in una particolare applicazione (ad esempio uno strumento di disegno), ma la classificazione geometrica è irrilevante per come 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 può avere scelte diverse su come trattare cerchi ed ellissi:
-
Considera cerchi ed ellissi come tipi distinti di forme con diverse UI (ad esempio due maniglie di ridimensionamento su un ellisso, una maniglia 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, inclusi i cerchi uguali, ma hai un'opzione per "bloccare" xey sullo stesso valore.
-
Gli ellissi sono solo cerchi in cui è stata applicata una trasformazione di ridimensionamento.
Ogni possibile progetto porterà a diversi modelli di oggetti -
Nel primo caso, Circle ed Ellipses saranno classi fratelli
Nel 2 °, non ci sarà affatto una classe Circle distinta
Nel 3 °, 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: Dovrebbe il cerchio estendere l'ellisse? La risposta è: dipende da cosa vuoi fare con esso. Ma probabilmente no.