Cormac có một câu trả lời thực sự tuyệt vời, nhưng tôi chỉ muốn giải thích một chút về lý do cho sự nhầm lẫn ở nơi đầu tiên.
Kế thừa trong OO thường được dạy bằng cách sử dụng các phép ẩn dụ trong thế giới thực, như "táo và cam là cả hai loại trái cây". Thật không may, điều này dẫn đến niềm tin nhầm lẫn rằng các loại trong OO nên được mô hình hóa theo một số phân cấp phân loại hiện có độc lập với chương trình.
Nhưng trong thiết kế phần mềm, các loại nên được mô hình hóa theo yêu cầu của ứng dụng. Phân loại trong các lĩnh vực khác thường không liên quan. Trong một ứng dụng thực tế với các đối tượng "Apple" và "Orange" - giả sử một hệ thống quản lý hàng tồn kho cho siêu thị - chúng có thể sẽ không phải là các lớp riêng biệt, và các danh mục như "Trái cây" sẽ là các thuộc tính chứ không phải là siêu kiểu.
Vấn đề hình tròn-elip là cá trích đỏ. Trong hình học, một vòng tròn là một chuyên môn của hình elip, nhưng các lớp trong ví dụ của bạn không phải là hình hình học. Điều quan trọng, các hình hình học không thể thay đổi. Chúng có thể được chuyển đổi , mặc dù, nhưng sau đó một vòng tròn có thể được chuyển đổi thành một dấu chấm lửng. Vì vậy, một mô hình trong đó các vòng tròn có thể thay đổi bán kính nhưng không thay đổi thành dấu chấm lửng không tương ứng với hình học. Một mô hình như vậy có thể có ý nghĩa trong một ứng dụng cụ thể (giả sử là một công cụ vẽ) nhưng phân loại hình học không liên quan đến cách bạn thiết kế hệ thống phân cấp lớp.
Vậy Circle nên là một lớp con của Ellipse hay ngược lại? Nó hoàn toàn phụ thuộc vào các yêu cầu của ứng dụng cụ thể sử dụng các đối tượng này. Một ứng dụng vẽ có thể có các lựa chọn khác nhau trong cách xử lý hình tròn và hình elip:
Coi các hình tròn và hình elip là các loại hình dạng khác nhau với giao diện người dùng khác nhau (ví dụ: hai tay cầm thay đổi kích thước trên hình elip, một tay cầm trên hình tròn). Điều này có nghĩa là bạn có thể có hình elip là hình tròn nhưng không phải hình tròn theo quan điểm của ứng dụng.
Đối xử với tất cả các hình elip bao gồm các vòng tròn giống nhau, nhưng có tùy chọn "khóa" x và y về cùng một giá trị.
Dấu chấm lửng chỉ là các vòng tròn trong đó một phép biến đổi tỷ lệ đã được áp dụng.
Mỗi thiết kế có thể sẽ dẫn đến mô hình đối tượng khác nhau -
Trong trường hợp đầu tiên, Circle và Ellipses sẽ là các lớp anh chị em
Trong phần 2, sẽ không có lớp Circle riêng biệt nào cả
Trong phần 3, sẽ không có lớp Ellipse riêng biệt. Vì vậy, vấn đề được gọi là hình tròn-elip không nhập hình ảnh vào bất kỳ trong số này.
Vì vậy, để trả lời câu hỏi như đặt ra: Có nên mở rộng hình elip? Câu trả lời là: Nó phụ thuộc vào những gì bạn muốn làm với nó. Nhưng có lẽ là không.