มันไม่ใช่เรื่องที่ดีที่สุด แต่ควรใช้เมื่อใด
ในกรณี 'ปกติ' คำถามง่าย ๆ ก็เพียงพอที่จะค้นหาว่าเราต้องการการสืบทอดหรือการรวม
- ถ้าคลาสใหม่นั้นมากหรือน้อยเหมือนคลาสเดิม ใช้การสืบทอด คลาสใหม่ตอนนี้เป็นคลาสย่อยของคลาสดั้งเดิม
- ถ้าคลาสใหม่ต้องมีคลาสเดิม ใช้การรวม คลาสใหม่ตอนนี้มีคลาสดั้งเดิมในฐานะสมาชิก
อย่างไรก็ตามมีพื้นที่สีเทาขนาดใหญ่ ดังนั้นเราจึงต้องการเทคนิคอื่น ๆ
- หากเราใช้การสืบทอด (หรือเราวางแผนที่จะใช้) แต่เราใช้เพียงบางส่วนของอินเตอร์เฟสหรือเราถูกบังคับให้แทนที่การทำงานจำนวนมากเพื่อรักษาความสัมพันธ์เชิงตรรกะ จากนั้นเรามีกลิ่นเหม็นขนาดใหญ่ที่บ่งบอกว่าเราต้องใช้การรวมตัว
- หากเราใช้การรวม (หรือเราวางแผนที่จะใช้) แต่เราพบว่าเราจำเป็นต้องคัดลอกฟังก์ชันการทำงานเกือบทั้งหมด จากนั้นเรามีกลิ่นที่ชี้ไปในทิศทางของการสืบทอด
การกรีดสั้น ๆ เราควรใช้การรวมหากส่วนหนึ่งของอินเทอร์เฟซไม่ได้ใช้หรือจะต้องมีการเปลี่ยนแปลงเพื่อหลีกเลี่ยงสถานการณ์ที่ไร้เหตุผล เราจำเป็นต้องใช้การสืบทอดถ้าเราต้องการฟังก์ชั่นเกือบทั้งหมดโดยไม่มีการเปลี่ยนแปลงที่สำคัญ และเมื่อมีข้อสงสัยให้ใช้การรวม
ความเป็นไปได้อื่น ๆ สำหรับกรณีที่เรามีคลาสที่ต้องการเป็นส่วนหนึ่งของการทำงานของคลาสเดิมคือการแยกคลาสดั้งเดิมในคลาสรูทและคลาสย่อย และให้คลาสใหม่สืบทอดจากคลาสรูท แต่คุณควรระวังสิ่งนี้ไม่ควรสร้างการแยกแบบไร้เหตุผล
ให้เพิ่มตัวอย่าง เรามีคลาส 'Dog' พร้อมวิธีการ: 'Eat', 'Walk', 'Bark', 'Play'
class Dog
Eat;
Walk;
Bark;
Play;
end;
ตอนนี้เราต้องการคลาส 'Cat' ที่ต้องการ 'Eat', 'Walk', 'Purr' และ 'Play' ดังนั้นก่อนอื่นให้พยายามยืดมันออกมาจากสุนัข
class Cat is Dog
Purr;
end;
ดูเหมือนจะเป็นไร แต่รอ แมวตัวนี้สามารถเห่าได้ (คนรักแมวจะฆ่าฉันอย่างนั้น) และแมวที่เห่าก็ละเมิดหลักการของจักรวาล ดังนั้นเราจำเป็นต้องแทนที่วิธีการเห่าเพื่อที่จะไม่ทำอะไรเลย
class Cat is Dog
Purr;
Bark = null;
end;
ตกลงใช้งานได้ แต่มันมีกลิ่นไม่ดี ดังนั้นลองรวมกัน:
class Cat
has Dog;
Eat = Dog.Eat;
Walk = Dog.Walk;
Play = Dog.Play;
Purr;
end;
ตกลงนี่เป็นสิ่งที่ดี แมวตัวนี้ไม่เห่าอีกต่อไปไม่แม้แต่จะเงียบ แต่ก็ยังมีสุนัขภายในที่ต้องการออก ดังนั้นให้ลองเลขโซลูชันที่สาม:
class Pet
Eat;
Walk;
Play;
end;
class Dog is Pet
Bark;
end;
class Cat is Pet
Purr;
end;
มันสะอาดกว่ามาก ไม่มีสุนัขภายใน และแมวและสุนัขอยู่ในระดับเดียวกัน เรายังสามารถแนะนำสัตว์เลี้ยงอื่น ๆ เพื่อขยายโมเดล นอกเสียจากว่าจะเป็นปลาหรืออะไรที่ไม่เดิน ในกรณีนั้นเราต้อง refactor อีกครั้ง แต่นั่นเป็นสิ่งที่เวลาอื่น