Cormac ma naprawdę świetną odpowiedź, ale po prostu chcę trochę wyjaśnić przyczynę zamieszania.
Dziedzictwo w OO jest często nauczane przy użyciu rzeczywistych metafor, takich jak „jabłka i pomarańcze są podklasami owoców”. Niestety prowadzi to do błędnego przekonania, że typy w OO powinny być modelowane zgodnie z pewnymi hierarchiami taksonomicznymi istniejącymi niezależnie od programu.
Ale w projektowaniu oprogramowania typy powinny być modelowane zgodnie z wymaganiami aplikacji. Klasyfikacje w innych domenach są zwykle nieistotne. W rzeczywistej aplikacji z obiektami „Apple” i „Orange” - powiedzmy systemem zarządzania zapasami w supermarkecie - prawdopodobnie nie będą to w ogóle odrębne klasy, a kategorie takie jak „Owoc” będą raczej atrybutami niż nadtypami.
Problemem elipsy koła jest czerwony śledź. W geometrii okrąg jest specjalizacją elipsy, ale klasy w twoim przykładzie nie są figurami geometrycznymi. Co najważniejsze, figury geometryczne nie są zmienne. Można je jednak przekształcić , ale potem koło można przekształcić w elipsę. Model, w którym okręgi mogą zmieniać promień, ale nie mogą zmieniać się w elipsę, nie odpowiada geometrii. Taki model może mieć sens w konkretnej aplikacji (np. Narzędzie do rysowania), ale klasyfikacja geometryczna nie ma znaczenia dla projektowania hierarchii klas.
Czy Circle powinien być podklasą Elipsy czy odwrotnie? Zależy to całkowicie od wymagań konkretnej aplikacji, która korzysta z tych obiektów. Aplikacja do rysowania może mieć różne możliwości traktowania kręgów i elips:
Traktuj koła i elipsy jako odrębne typy kształtów o różnym interfejsie użytkownika (np. Dwa uchwyty zmiany rozmiaru na elipsie, jeden uchwyt na okręgu). Oznacza to, że z perspektywy aplikacji możesz mieć elipsę, która jest geometrycznie kołem, ale nie kołem.
Traktuj wszystkie elipsy, w tym okręgi, tak samo, ale masz opcję „zablokowania” xiy na tej samej wartości.
Elipsy są po prostu okręgami, w których zastosowano transformację skalowania.
Każdy możliwy projekt doprowadzi do innego modelu obiektu -
W pierwszym przypadku Circle i Elipsy będą klasami dla rodzeństwa
W drugim nie będzie w ogóle odrębnej klasy Kręgów
W trzecim nie będzie wyraźnej klasy elipsy. Tak więc tzw. Problem elipsy koła nie wchodzi w obraz w żadnym z nich.
Aby odpowiedzieć na postawione pytanie: Czy okrąg powinien rozciągać się na elipsie? Odpowiedź brzmi: to zależy od tego, co chcesz z tym zrobić. Ale prawdopodobnie nie.