ข้อดีของภาษา C# เมื่อเทียบกับภาษาอื่น ๆ : Interface กับ การสืบคุณสมบัติจากหลายแหล่ง (Multiple Inheritance)

การออกแบบและเขียนโปรแกรมแบบ OOP (Object Oriented) ตั้งอยู่บนหลักการสามประการที่เปรียบได้กับสามเสาหลัก ประกอบด้วย Encapsulation, Inheritance และ Polymorphism หากท่านเข้าใจหลักการทั้งสามนี้ ก็เท่ากับว่าท่านเข้าใจหัวใจของ OOP ทั้งหมดแล้ว สำหรับบทความนี้จะกล่าวถึงการสืบคุณสมบัติ หรือ Inheritance นั่นเอง
ภาพหน้าปก Interface กับ การสืบคุณสมบัติจากหลายแหล่ง (Multiple Inheritance)
ทักษะ (ระบุได้หลายทักษะ)

ข้อดีของภาษา 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