Cormac a une très bonne réponse, mais je veux juste développer un peu sur la raison de la confusion en premier lieu.
L'héritage en OO est souvent enseigné en utilisant des métaphores du monde réel, comme «les pommes et les oranges sont toutes deux des sous-classes de fruits». Malheureusement, cela conduit à croire à tort que les types en OO devraient être modélisés selon certaines hiérarchies taxonomiques existant indépendamment du programme.
Mais dans la conception de logiciels, les types doivent être modélisés en fonction des exigences de l'application. Les classifications dans d'autres domaines ne sont généralement pas pertinentes. Dans une application réelle avec des objets "Apple" et "Orange" - par exemple un système de gestion des stocks pour un supermarché - ils ne seront probablement pas du tout des classes distinctes, et des catégories comme "Fruit" seront des attributs plutôt que des supertypes.
Le problème du cercle-ellipse est un hareng rouge. En géométrie, un cercle est une spécialisation d'une ellipse, mais les classes de votre exemple ne sont pas des figures géométriques. Surtout, les figures géométriques ne sont pas modifiables. Ils peuvent être transformés , mais un cercle peut ensuite être transformé en ellipses. Ainsi, un modèle où les cercles peuvent changer de rayon mais pas se transformer en ellipses ne correspond pas à la géométrie. Un tel modèle peut avoir un sens dans une application particulière (par exemple, un outil de dessin), mais la classification géométrique n'a pas d'importance pour la façon dont vous concevez la hiérarchie des classes.
Donc, Circle devrait-il être une sous-classe d'Ellipse ou vice versa? Cela dépend totalement des exigences de l'application particulière qui utilise ces objets. Une application de dessin peut avoir différents choix pour traiter les cercles et les ellipses:
Traitez les cercles et les ellipses comme des types de formes distincts avec une interface utilisateur différente (par exemple, deux poignées de redimensionnement sur une ellipse, une poignée sur un cercle). Cela signifie que vous pouvez avoir une ellipse qui est géométriquement un cercle mais pas un cercle du point de vue de l'application.
Traitez toutes les ellipses, y compris les cercles, de la même manière, mais vous avez la possibilité de "verrouiller" x et y à la même valeur.
Les ellipses ne sont que des cercles où une transformation d'échelle a été appliquée.
Chaque conception possible conduira à un modèle d'objet différent -
Dans le premier cas, Circle et Ellipses seront des classes de frères
Dans le 2ème, il n'y aura pas du tout de classe Cercle distincte
Dans le 3ème, il n'y aura pas de classe Ellipse distincte. Ainsi, le soi-disant problème de cercle-ellipse n'entre dans l'image dans aucun d'entre eux.
Donc, pour répondre à la question posée: le cercle doit-il étendre l'ellipse? La réponse est: cela dépend de ce que vous voulez en faire. Mais probablement pas.