คอร์แม็กมีคำตอบที่ดีมาก แต่ฉันแค่ต้องการอธิบายรายละเอียดเกี่ยวกับเหตุผลของความสับสนในตอนแรก
การสืบทอดใน OO มักสอนโดยใช้คำอุปมาอุปมัยในโลกแห่งความจริงเช่น "แอปเปิ้ลและส้มเป็นทั้งผลไม้ย่อย" น่าเสียดายที่สิ่งนี้นำไปสู่ความเชื่อที่ผิดที่ประเภทใน OO ควรถูกสร้างแบบจำลองตามลำดับชั้นของอนุกรมวิธานบางอย่างที่เป็นอิสระจากโปรแกรม
แต่ในการออกแบบซอฟต์แวร์ประเภทควรเป็นแบบจำลองตามข้อกำหนดของแอปพลิเคชัน การจำแนกประเภทในโดเมนอื่นมักไม่เกี่ยวข้อง ในแอปพลิเคชันจริงที่มีวัตถุ "Apple" และ "Orange" - กล่าวว่าระบบการจัดการสินค้าคงคลังสำหรับซุปเปอร์มาร์เก็ต - พวกเขาอาจจะไม่ได้เรียนที่แตกต่างกันและหมวดหมู่เช่น "ผลไม้" จะเป็นคุณลักษณะมากกว่าประเภทซุปเปอร์
ปัญหาวงรีวงรีคือปลาเฮอริ่งแดง ในเรขาคณิตวงกลมเป็นลักษณะเฉพาะของวงรี แต่คลาสในตัวอย่างของคุณไม่ใช่ตัวเลขทางเรขาคณิต รูปทรงเรขาคณิตที่สำคัญไม่สามารถเปลี่ยนแปลงได้ พวกมันสามารถถูกเปลี่ยนรูปได้ แต่จากนั้นสามารถเปลี่ยนเป็นวงรีได้ ดังนั้นแบบจำลองที่วงกลมสามารถเปลี่ยนรัศมี แต่ไม่เปลี่ยนเป็นจุดไข่ปลาไม่ตรงกับเรขาคณิต แบบจำลองดังกล่าวอาจสมเหตุสมผลในแอปพลิเคชันเฉพาะ (พูดเครื่องมือวาดรูป) แต่การจำแนกทางเรขาคณิตไม่เกี่ยวข้องกับวิธีที่คุณออกแบบลำดับชั้นของชั้นเรียน
ดังนั้น Circle ควรเป็น subclass ของ Ellipse หรือในทางกลับกัน มันขึ้นอยู่กับข้อกำหนดของแอพพลิเคชั่นเฉพาะซึ่งใช้วัตถุเหล่านี้โดยสิ้นเชิง แอปพลิเคชั่นการวาดอาจมีตัวเลือกที่แตกต่างกันในการรักษาวงกลมและจุดไข่ปลา:
ปฏิบัติต่อแวดวงและจุดไข่ปลาเป็นรูปร่างที่แตกต่างกันด้วย UI ที่แตกต่างกัน (เช่นสองมือจับปรับขนาดบนจุดไข่ปลาหนึ่งด้ามบนวงกลม) ซึ่งหมายความว่าคุณสามารถมีวงรีซึ่งเป็นรูปวงกลม แต่ไม่ได้เป็นวงกลมจากมุมมองของแอปพลิเคชัน
ปฏิบัติต่อจุดไข่ปลาทั้งหมดรวมถึงแวดวงเดียวกัน แต่มีตัวเลือก "ล็อค" x และ y เป็นค่าเดียวกัน
วงรีเป็นเพียงวงกลมที่มีการใช้การแปลงสเกล
แต่ละการออกแบบที่เป็นไปได้จะนำไปสู่รูปแบบวัตถุที่แตกต่างกัน -
ในกรณีที่ 1 Circle และ Ellipses จะเป็นคลาสพี่น้อง
ในอันที่สองจะไม่มีคลาส Circle ที่แตกต่างออกไปเลย
ในอันที่ 3 จะไม่มีคลาส Ellipse ที่แตกต่างกัน ดังนั้นปัญหาวงรีวงรีที่เรียกว่าไม่ได้ป้อนรูปภาพในสิ่งเหล่านี้
ดังนั้นเพื่อตอบคำถามตามที่ตั้งไว้: วงกลมควรขยายวงรีหรือไม่? คำตอบคือ: ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำกับมัน แต่อาจจะไม่