ข้อดีของภาษา C# เมื่อเทียบกับภาษาอื่น ๆ : Interface กับ การสืบคุณสมบัติจากหลายแหล่ง (Multiple Inheritance)
การออกแบบและเขียนโปรแกรมแบบ OOP (Object Oriented) ตั้งอยู่บนหลักการ 3 ประการที่เปรียบได้กับ 3 เสาหลัก
ประกอบด้วย Encapsulation, Inheritance และ Polymorphism หากท่านเข้าใจหลักการทั้งสามนี้ ก็เท่ากับว่าท่านเข้าใจหัวใจของ OOP ทั้งหมดแล้ว
สำหรับบทความนี้จะกล่าวถึงการสืบคุณสมบัติ หรือ Inheritance นั่นเอง
ในขณะที่ภาษา OOP อื่น ๆ ส่วนมาก (เช่น C++) สนับสนุน “การสืบคุณสมบัติจากหลายแหล่ง” (Multiple Inheritance ย่อ MI)
แต่ภาษา C# สนับสนุนเฉพาะ“การสืบคุณสมบัติจากแหล่งเดียว” (Single Inheritance ย่อ SI) เมื่อสิ่งที่จะสืบคุณสมบัติ คือ Class
แต่อย่างไรก็ดี ภาษา C# สนับสนุนการทำ MI ด้วยเหมือนกันในกรณีที่สิ่งที่จะสืบคุณสมบัติเป็น Interface
นั่นหมายความว่า ถ้าที่สิ่งที่เราจะสืบคุณสมบัติมาเป็น Interface เราจะสืบมาสักกี่ตัวก็ได้ตามใจชอบ
ยกตัวอย่างเช่นในแผนภูมิด้านล่างนี้ หากเรามี Interface 2 ตัวคือ ILeft และ IRight
เราสามารถนิยาม Interface IBody ที่สืบคุณสมบัติมาจากทั้ง ILeft และ IRight ได้ และมี Class Robot ที่สืบคุณสมบัติจาก IBody อีกที
ซึ่งจะ Class Robot จะได้รับทุกอย่างจากทั้ง ILeft , IRight และ IBody ส่วน Client คือโค้ดที่นำ Class Robot ไปสร้าง Object เพื่อใช้งาน


รูปที่ 1 แสดงตัวอย่างโค้ดอินเตอร์เฟสกับการสืบคุณสมบัติจากหลายแหล่ง
บรรทัดที่ 5-8: คือนิยาม Interface IRight ที่มีสมาชิกตัวเดียวคือส่วนประกาศ method RightLog
บรรทัดที่ 9-12: คือนิยาม Interface ILeft ที่มีสมาชิกตัวเดียวคือส่วนประกาศ method LeftLog
บรรทัดที่ 13-16: คือนิยาม Interface IBody ที่สืบคุณสมบัติจาก Interface ILeft และ IRight และมีสมาชิกตัวเดียวคือส่วนประกาศ method BodyLog
บรรทัดที่ 17- 35: คือนิยาม Class Robot ที่สืบคุณสมบัติจาก Interface IBody จึงต้องใส่นิยามและไส้ของ method ทั้งหมดที่ระบุไว้ใน Interface ILeft , IRight และ IBody
บรรทัดที่ 19-22: นิยามและไส้ของ method RightLog
บรรทัดที่ 23-26: นิยามและไส้ของ method LeftLog
บรรทัดที่ 27-30: นิยามและไส้ของ method BobyLog
บรรทัดที่ 31- 34: นิยาม method RobotLog
เนื่องจาก method ทั้งหมด ไม่ว่าจะอยู่ใน Interface ใด ๆ ในตัวอย่างนี้ ไม่มีชื่อซ้ำกันเลย จึงไม่มีปัญหาเรื่องความกำกวมในการอ้างถึงและเรียกใช้

รูปที่ 2 แสดงตัวอย่างการใช้ Interface กับการสืบคุณสมบัติจากหลายแหล่ง
บรรทัดที่ 41-45 สาธิตการสร้างและใช้งาน Object จาก Type Robot และ new โดยเรียก Constructor Robot()
บรรทัดที่ 47-51 สาธิตการสร้างและใช้งาน Object จาก Type IBody แต่ new โดยเรียก Constructor ของ Class Robot
จะเห็นว่าผลลัพธ์เหมือนกัน ต่างกันตรงที่หากใช้ Type IBody จะมีผลให้ Object myAndroi มองไม่เห็น method RobotLog เพราะ Interface IBody ไม่มี method ดังกล่าว
จากบทความนี้ ท่านผู้อ่านน่าจะรู้จักการสืบคุณสมบัติจากหลายแหล่ง (Multiple Inheritance) มากยิ่งขึ้นนะครับ
โดยสรุป C# สามารถสืบคุณสมบัติจากหลายแหล่งได้กรณีที่สิ่งที่จะสืบคุณสมบัตินั้นเป็น Interface











