Cormac은 정말 훌륭한 답변을 얻었지만 처음에는 혼란의 이유에 대해 조금만 설명하고 싶습니다.
OO의 상속은 종종 "사과와 오렌지는 과일의 하위 클래스입니다"와 같은 실제 은유를 사용하여 가르칩니다. 불행하게도 이것은 OO의 유형이 프로그램과 독립적으로 존재하는 일부 분류 학적 계층에 따라 모델링되어야한다는 잘못된 믿음으로 이어진다.
그러나 소프트웨어 디자인에서 응용 프로그램의 요구 사항에 따라 유형을 모델링해야합니다. 다른 영역에서의 분류는 일반적으로 관련이 없습니다. "Apple"및 "Orange"개체가있는 실제 응용 프로그램 (예 : 슈퍼마켓의 재고 관리 시스템)에서는 아마도 별개의 클래스가 아니며 "Fruit"과 같은 범주는 수퍼 타입이 아닌 속성이됩니다.
원형 타원 문제는 붉은 청어입니다. 형상에서 원은 타원의 특수화이지만 예제의 클래스는 기하학적 도형이 아닙니다. 결정적으로 기하학적 수치는 변경할 수 없습니다. 그래도 변형 될 수 있지만 원 은 줄임표로 변형 될 수 있습니다. 따라서 원이 반지름을 변경할 수 있지만 줄임표로 변경할 수없는 모델은 형상에 해당하지 않습니다. 이러한 모델은 특정 응용 프로그램 (예 : 그리기 도구)에서 의미가 있지만 기하학적 분류는 클래스 계층 구조를 설계하는 방법과 관련이 없습니다.
그렇다면 Circle은 Ellipse의 하위 클래스 여야합니까? 이 객체를 사용하는 특정 응용 프로그램의 요구 사항에 전적으로 의존합니다. 그림 응용 프로그램은 원과 타원을 처리하는 방법에서 다른 선택을 할 수 있습니다.
원과 타원을 UI가 다른 고유 한 유형의 모양으로 취급합니다 (예 : 줄임표에 두 개의 크기 조정 핸들, 원에 하나의 핸들). 즉, 응용 프로그램의 관점에서 기하학적으로 원이지만 원이 아닌 타원을 가질 수 있습니다.
원을 포함한 모든 타원은 동일하게 취급하지만 x와 y를 같은 값으로 "잠그는"옵션이 있습니다.
타원은 스케일링 변환이 적용된 원일뿐입니다.
각각의 가능한 디자인은 다른 객체 모델로 이어질 것입니다-
첫 번째 경우 Circle 및 Ellipses는 형제 수업이됩니다.
두 번째 것에는 별개의 서클 클래스가 전혀 없습니다.
세 번째 클래스에는 별개의 타원 클래스가 없습니다. 따라서 소위 원형 타원 문제는 이들 중 어느 것도 그림에 들어 가지 않습니다.
따라서 제기 된 질문에 대답하려면 원이 타원을 확장해야합니까? 답은 : 당신이하고 싶은 것에 달려 있습니다. 그러나 아마 아닐 것입니다.