Cormac memiliki jawaban yang sangat bagus, tetapi saya hanya ingin menguraikan sedikit tentang alasan kebingungan di tempat pertama.
Warisan dalam OO sering diajarkan menggunakan metafora dunia nyata, seperti "apel dan jeruk keduanya sub-kelas buah". Sayangnya ini mengarah pada kepercayaan yang salah bahwa tipe dalam OO harus dimodelkan menurut beberapa hierarki taksonomi yang ada terlepas dari program.
Tetapi dalam desain perangkat lunak, jenis harus dimodelkan sesuai dengan persyaratan aplikasi. Klasifikasi di domain lain biasanya tidak relevan. Dalam aplikasi aktual dengan objek "Apple" dan "Orange" - katakan sistem manajemen persediaan untuk supermarket - mereka mungkin tidak akan menjadi kelas yang berbeda sama sekali, dan kategori seperti "Buah" akan menjadi atribut daripada supertipe.
Masalah lingkaran-elips adalah herring merah. Dalam geometri, lingkaran adalah spesialisasi elips, tetapi kelas dalam contoh Anda bukan angka geometris. Yang terpenting, figur geometris tidak dapat berubah. Meskipun demikian, mereka dapat ditransformasikan , tetapi kemudian sebuah lingkaran dapat diubah menjadi elipsis. Jadi model di mana lingkaran dapat mengubah radius tetapi tidak berubah menjadi elipsis tidak sesuai dengan geometri. Model seperti itu mungkin masuk akal dalam aplikasi tertentu (misalnya alat gambar) tetapi klasifikasi geometri tidak relevan untuk bagaimana Anda mendesain hierarki kelas.
Jadi haruskah Circle menjadi subclass dari Ellipse atau sebaliknya? Ini benar-benar tergantung pada persyaratan aplikasi tertentu yang menggunakan objek-objek ini. Aplikasi menggambar dapat memiliki pilihan berbeda dalam cara memperlakukan lingkaran dan elips:
Perlakukan lingkaran dan elips sebagai jenis bentuk yang berbeda dengan UI yang berbeda (mis. Dua gagang pengubah ukuran pada elipsis, satu gagang pada lingkaran). Ini berarti Anda dapat memiliki elips yang secara geometris merupakan lingkaran tetapi bukan Lingkaran dari perspektif aplikasi.
Perlakukan semua elips termasuk lingkaran yang sama, tetapi memiliki opsi untuk "mengunci" x dan y dengan nilai yang sama.
Elips hanyalah lingkaran tempat transformasi penskalaan telah diterapkan.
Setiap desain yang memungkinkan akan mengarah pada model objek yang berbeda -
Dalam kasus pertama, Circle dan Ellipses akan menjadi kelas saudara kandung
Di yang ke-2, tidak akan ada kelas Lingkaran yang berbeda sama sekali
Di yang ke-3, tidak akan ada kelas Ellipse yang berbeda. Jadi masalah yang disebut lingkaran-elips tidak memasukkan gambar dalam semua ini.
Jadi untuk menjawab pertanyaan seperti yang diajukan: Haruskah lingkaran memanjang elips? Jawabannya adalah: Itu tergantung pada apa yang ingin Anda lakukan dengannya. Tapi mungkin juga tidak.