Inheritance in C#
ไตรรัตน์ ศรพรหม 650710545
บทนำ
ในส่วนนี้จะมาอธิยายเกี่ยวกับ การสืบทอด (Inheritance) ใน C# ซึ่งจะช่วยให้เรานั้นสามารถสร้างคลาสใหม่ขึ้นมาได้โดยใช้คุณสมบัติต่างๆของคลาสที่มีอยู่แล้ว ซึ่งใน C# จะเรียกว่า คลาสฐาน (Base Class) ส่วนคลาสที่สืบทอดจะเรียกว่า Derived Class โดยคลาสนี้จะได้รับคุณสมบัติ (properties) และพฤติกรรม (methods) จากคลาสฐาน และยังสามารถเพิ่มหรือปรับแต่งฟังก์ชันการทำงานของตัวเองได้อีกด้วย
ข้อดีของการ Inheritance
ช่วยลดความซ้ำซ้อนและทำให้อ่านง่ายขึ้นเพราะไม่จำเป็นต้องเขียนโค้ดเดิมซ้ำซ้อนในคลาสลูกหลายๆตัว
บำรุงรักษาง่ายเพราะการแยกเป็นคลาสต่างๆ และในการสืบทอดนั้นหากแก้อะไรในคลาสฐานจะส่งผลให้คลาสลูกถูกเปลี่ยนแปลงไปด้วย
สามารถแต่งเติมหรือเพิ่มเมธอดหรืออื่นๆในคลาสลูกได้ใหม่จากการสืบทอดซึ่งช่วยให้การพัฒนาโปรแกรมเป็นไปอย่างยืดหยุ่นมากขึ้นและสามารถปรับเปลี่ยนได้ง่ายอีกด้วย
Syntax ในภาษาต่างๆ
การสืบทอดในแต่ละภาษาจะใช้ Syntax ต่างกันตามดังตัวอย่างด้านบนนี้
รูปแบบของการสืบทอด
ใน C# นั้นจะมีการสืบทอดอยู่ 4 ประเภทประเภทตามตัวอย่างดังนี้
การสืบทอดแบบชั้นเดียว (Single Inheritance)
เป็นการสืบทอดที่เป็นพื้นฐานมากที่สุด โดยคลาสลูกนั้นจะสืบทอดมาจาก คลาสฐาน (Base Class) เพียงคลาสเดียวเท่านั้น
ตัวอย่าง
จากตัวอย่าง คลาสลูก คือ Dog นั้น สืบทอดมาจาก คลาสฐาน นั่นคือ Animal เพียงคลาสเดียว
การสืบทอดแบบหลายชั้น (Multilevel Inheritance)
เป็นการสืบทอดหลายชั้นจากคลาสลูก ซึ่งเกิดจากคลาสลูกนั้นสามารถสืบทอดจากคลาสลูกอื่นๆด้วยกันได้ ซึ่งคลาสลูกนั้นสืบทอดมาจากคลาสฐานอีกที
ตัวอย่าง
จะเห็นได้ว่าคลาส Mammal นั้นสืบทอดมาจาก Animal ซึ่งเราสร้างคลาส Horse ขึ้นมาใหม่และทำการสืบทอดจากคลาส Mammal ได้ แม้ Mammal จะเป็นคลาสลูกก็ตาม และทำให้ Horse เข้าสามารถถึงข้อมูลฟังก์ชันจากทั้ง Animal และ Mammal ได้
การสืบทอดแบบลำดับขั้น (Hierarchical Inheritance)
คลาสหลายๆคลาสนั้นจะสามารถสืบทอดมาจากคลาสเดียวกันได้
ตัวอย่าง
จะเห็นได้ว่าคลาส Eagle และ Penguin สืบทอดมาจากคลาสเดียวกันนั่นคือคลาส Bird
การสืบทอดหลายคลาส (Multiple Inheritance)
เนื่องจากในภาษา C# นั้นไม่รองรับการสืบทอดหลายคลาสโดยตรง แต่เราสามารถประประยุกต์ใช้ Interface แทนได้ซึ่งจะเป็นการจำลองการสืบทอดหลายคลาส
ตัวอย่าง
จากตัวอย่างเราสร้าง Interface ขั้นมา 2 อันคือ I1 และ I2 และสร้างคลาส MyClass ขึ้นมาและทำการสืบทอดจาก Interface ทั้ง 2 อัน คือ I1 และ I2 ซึ่งคลาสนั้นจะสืบทอด Interface ได้มากกว่า 1 Interface ทำให้คลาส MyClass สามารถสืบทอดได้ 2 interface พร้อมกันและสามารถเข้าสามารถถึงข้อมูลฟังก์ชันจากทั้ง I1 และ I2
ตัวอย่างโค้ด
Ex1
โค้ดและตัวอย่างการเขียนหากเป็นภาษาอื่นๆ ในโจทย์เดียวกัน
จากตัวอย่างEx1 คลาสฐานชื่อ Vehicle มีเมธอด honk() และมีคลาสลูกคือ Car ซื่งสือทอดมาจาก Vehicle และในคลาส Car มีเมธอด modelName() ในคลาส Main ได้ทำการสร้าง object ของคลาส Car ขึ้นมาชื่อ myCar ซึ่งเราสามารถเรียกใช้ เมธอด honk()ที่อยู่ในคลาส Vehicle จาก myCar ได้โดยการใช้ myCar.honk(); เพราะว่าการสืบทอดกันจะสามารถเข้าถึงข้อมูลฟังก์ชันระหว่างคลาสฐานและคลาสลูกได้
เปรีบเทียบ C# กับแต่ละภาษา
คำสั่ง Console.WriteLine
ใน C# ถูกแปลงเป็น System.out.println
และ keyword ในการสืบทอดเป็น extends แทนใน Java และ การสืบทอดคลาสและฟิลด์ต่าง ๆ เหมือนกับใน C# เลย
ใน Python จะไม่มี constructor เหมือนกับ C# แต่ใช้ method __init__()
แทนกัน และมีคำสั่ง super().__init__()
ใน class Car ใช้เพื่อเรียก constructor ของ class Vehicle
ใน C++ มีความพิเศษกว่าภาษาอื่นเพราะ การสืบทอดจะสามารถใส่ Access Modifiers ได้ตามตัวอย่างโค้ดด้านบน จาก class Car : public Vehicle
นอกนั้นการสืบทอดคลาสและฟิลด์ต่าง ๆ เหมือนกับใน C#
เปรียบเทียบการ Inheritance ใน C# กับภาษา Java / C++ / Python
การสืบทอด (Inheritance) ระหว่าง C#, Java, C++, และ Python นั้นมีหลายอย่างมากที่แตกต่างกันซึ่งอาจจะเป็นเรื่องคีย์เวิร์ด รูปแบบการสืบทอด และความสามารถของภาษา แต่ละภาษามีวิธีการจัดการ inheritance ที่ไม่เหมือนกัน
เปรียบเทียบตัวอย่างแต่ละภาษา
Java
คีย์เวิร์ดที่ใช้: extends, super, abstract, final
รูปแบบการสืบทอด: Single Inheritance (สืบทอดชั้นเดียว), Multilevel Inheritance (สืบทอดหลายชั้น), Hierarchical Inheritance (สืบทอดแบบลำดับขั้น)
Multiple Inheritance: Java นั้นจะไม่รองรับ Multiple Inheritance ของคลาส แต่สามารถใช้ Interfaces ได้เหมือนกันกับ C#
Access Modifiers: ใช้ public, private, protected, default (package-private)
การใช้งาน: คลาสลูกจะใช้คีย์เวิร์ด extends ในการสืบทอด และ override เมธอดของคลาสแม่ได้โดยใช้ @override
C++
คีย์เวิร์ดที่ใช้: class, public, protected, private, virtual, override, final
รูปแบบการสืบทอด: Single Inheritance, Multilevel Inheritance, Hierarchical Inheritance, Multiple Inheritance
Multiple Inheritance: ในC++ นั้นรองรับ Multiple Inheritance โดยตรง
Access Modifiers: ใช้ public, private, protected
การใช้งาน: ภาษา C++ มีความยืดหยุ่นสูงมากทั้ง สามารถใส่ Access Modifiers ให้คลาสแม่ที่สืบทอดมาได้ด้วย และยังมีการจัดการ memory ที่อะเอียดมากและยังสามารถใช้ virtual inheritance เพื่อแก้ปัญหาชื่อซ้ำจากการสืบทอดหลายคลาสได้ด้วย
Python
คีย์เวิร์ดที่ใช้: class, super()
รูปแบบการสืบทอด: Single Inheritance, Multilevel Inheritance, Hierarchical Inheritance
Multiple Inheritance: Python สามารถทำ Multiple Inheritance ได้โดยตรงเลย
Access Modifiers: ไม่มี access modifier แต่จะใช้ _ และ __ แทนการเป็น private/protected
การใช้งาน: ใน Python สามารถใช้การสืบทอดได้ง่ายดายมากเพราะคลาสลูกสามารถสืบทอดและ override เมธอดของคลาสแม่ได้อย่างอิสระ
ตัวอย่าง Multiple Inheritance ใน Python
จะเห็นว่า class4 นั้นสามารถสืบทอด Class2 และ Class3 ได้พร้อมกันได้โดยตรง ไม่เหมือน C# ที่ต้องประยุคใช้ Interface
สรุปการเปรียบเทียบ
C# และ Java: นั้นสองภาษามีรูปแบบการสืบทอดที่ใกล้เคียงกันมาก แต่ C# มีการใช้ : และ base ในขณะที่ Java นั้นจะใช้ extends และ super แทน
C++: มีความยืดหยุ่นสูงที่สุดในแง่ของการสืบทอด รองรับ Multiple Inheritance และมีการจัดการชื่อซ้ำจากการสืบทอดหลายคลาสอีกด้วย
Python: จะรองรับ Multiple Inheritance โดยตรง และมีความยืดหยุ่นมากในเรื่องการ inheritance เพราะมีการเขียนที่เรียบง่าย
Video และ Slide
Video
Slide
แหล่งอ้างอิง
w3school. (n.d.). C# Inheritance. https://www.w3schools.com/cs/cs_inheritance.php
microsoft. (17/02/2022). Inheritance - derive types to create more specialized behavior.https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/object-oriented/inheritance
tutorialspoint. (n.d). C# - Inheritance.https://www.tutorialspoint.com/csharp/csharp_inheritance.htm
kirti_mangal. (06/04/2023). C# | Inheritance. https://www.geeksforgeeks.org/c-sharp-inheritance/
soumya08. (22/02/2022). Multiple Inheritance in Python. https://www.geeksforgeeks.org/multiple-inheritance-in-python/
cplusplus. (n.d.). Friendship and inheritance. https://cplusplus.com/doc/tutorial/inheritance/
javatpoint. (n.d). Inheritance in Java. https://www.javatpoint.com/inheritance-in-java
python. (n.d) : 9.5.1. Multiple Inheritance. https://docs.python.org/3/tutorial/classes.html#inheritance
Last updated