Inheritance in C#
ไตรรัตน์ ศรพรหม 650710545
บทนำ
ในส่วนนี้จะมาอธิยายเกี่ยวกับ การสืบทอด (Inheritance) ใน C# ซึ่งจะช่วยให้เรานั้นสามารถสร้างคลาสใหม่ขึ้นมาได้โดยใช้คุณสมบัติต่างๆของคลาสที่มีอยู่แล้ว ซึ่งใน C# จะเรียกว่า คลาสฐาน (Base Class) ส่วนคลาสที่สืบทอดจะเรียกว่า Derived Class โดยคลาสนี้จะได้รับคุณสมบัติ (properties) และพฤติกรรม (methods) จากคลาสฐาน และยังสามารถเพิ่มหรือปรับแต่งฟังก์ชันการทำงานของตัวเองได้อีกด้วย
ข้อดีของการ Inheritance
ช่วยลดความซ้ำซ้อนและทำให้อ่านง่ายขึ้นเพราะไม่จำเป็นต้องเขียนโค้ดเดิมซ้ำซ้อนในคลาสลูกหลายๆตัว
บำรุงรักษาง่ายเพราะการแยกเป็นคลาสต่างๆ และในการสืบทอดนั้นหากแก้อะไรในคลาสฐานจะส่งผลให้คลาสลูกถูกเปลี่ยนแปลงไปด้วย
สามารถแต่งเติมหรือเพิ่มเมธอดหรืออื่นๆในคลาสลูกได้ใหม่จากการสืบทอดซึ่งช่วยให้การพัฒนาโปรแกรมเป็นไปอย่างยืดหยุ่นมากขึ้นและสามารถปรับเปลี่ยนได้ง่ายอีกด้วย
Syntax ในภาษาต่างๆ
class derived-class : base-class
{
// methods and fields
.
.
}
การสืบทอดในแต่ละภาษาจะใช้ Syntax ต่างกันตามดังตัวอย่างด้านบนนี้
รูปแบบของการสืบทอด
ใน C# นั้นจะมีการสืบทอดอยู่ 4 ประเภทประเภทตามตัวอย่างดังนี้
การสืบทอดแบบชั้นเดียว (Single Inheritance)
เป็นการสืบทอดที่เป็นพื้นฐานมากที่สุด โดยคลาสลูกนั้นจะสืบทอดมาจาก คลาสฐาน (Base Class) เพียงคลาสเดียวเท่านั้น
ตัวอย่าง
class Animal {
public void Eat() {
Console.WriteLine("Animal is eating.");
}
}
class Dog : Animal {
public void Bark() {
Console.WriteLine("Dog is barking.");
}
}
จากตัวอย่าง คลาสลูก คือ Dog นั้น สืบทอดมาจาก คลาสฐาน นั่นคือ Animal เพียงคลาสเดียว
การสืบทอดแบบหลายชั้น (Multilevel Inheritance)
เป็นการสืบทอดหลายชั้นจากคลาสลูก ซึ่งเกิดจากคลาสลูกนั้นสามารถสืบทอดจากคลาสลูกอื่นๆด้วยกันได้ ซึ่งคลาสลูกนั้นสืบทอดมาจากคลาสฐานอีกที
ตัวอย่าง
class Animal {
public void Eat() {
Console.WriteLine("Animal is eating.");
}
}
class Mammal : Animal {
public void Run() {
Console.WriteLine("Mammal is running.");
}
}
class Horse : Mammal {
public void Gallop() {
Console.WriteLine("Horse is galloping.");
}
}
จะเห็นได้ว่าคลาส Mammal นั้นสืบทอดมาจาก Animal ซึ่งเราสร้างคลาส Horse ขึ้นมาใหม่และทำการสืบทอดจากคลาส Mammal ได้ แม้ Mammal จะเป็นคลาสลูกก็ตาม และทำให้ Horse เข้าสามารถถึงข้อมูลฟังก์ชันจากทั้ง Animal และ Mammal ได้
การสืบทอดแบบลำดับขั้น (Hierarchical Inheritance)
คลาสหลายๆคลาสนั้นจะสามารถสืบทอดมาจากคลาสเดียวกันได้
ตัวอย่าง
class Animal {
public void Eat() {
Console.WriteLine("Animal is eating.");
}
}
class Bird : Animal {
public void Fly() {
Console.WriteLine("Bird is flying.");
}
}
class Eagle : Bird {
public void Hunt() {
Console.WriteLine("Eagle is hunting.");
}
}
class Penguin : Bird {
public void Swim() {
Console.WriteLine("Penguin is swimming.");
}
}
จะเห็นได้ว่าคลาส Eagle และ Penguin สืบทอดมาจากคลาสเดียวกันนั่นคือคลาส Bird
การสืบทอดหลายคลาส (Multiple Inheritance)
เนื่องจากในภาษา C# นั้นไม่รองรับการสืบทอดหลายคลาสโดยตรง แต่เราสามารถประประยุกต์ใช้ Interface แทนได้ซึ่งจะเป็นการจำลองการสืบทอดหลายคลาส
ตัวอย่าง
interface I1 {
void Method1();
}
interface I2 {
void Method2();
}
class MyClass : I1, I2 {
public void Method1() {
Console.WriteLine("Method1 is called.");
}
public void Method2() {
Console.WriteLine("Method2 is called.");
}
}
จากตัวอย่างเราสร้าง Interface ขั้นมา 2 อันคือ I1 และ I2 และสร้างคลาส MyClass ขึ้นมาและทำการสืบทอดจาก Interface ทั้ง 2 อัน คือ I1 และ I2 ซึ่งคลาสนั้นจะสืบทอด Interface ได้มากกว่า 1 Interface ทำให้คลาส MyClass สามารถสืบทอดได้ 2 interface พร้อมกันและสามารถเข้าสามารถถึงข้อมูลฟังก์ชันจากทั้ง I1 และ I2
ตัวอย่างโค้ด
Ex1
โค้ดและตัวอย่างการเขียนหากเป็นภาษาอื่นๆ ในโจทย์เดียวกัน
class Vehicle // base class (parent)
{
public string brand = "Ford"; // Vehicle field
public void honk() // Vehicle method
{
Console.WriteLine("Tuut, tuut!");
}
}
class Car : Vehicle // derived class (child)
{
public string modelName = "Mustang"; // Car field
}
class Program
{
static void Main(string[] args)
{
t
Car myCar = new Car();
myCar.honk();
Class
Console.WriteLine(myCar.brand + " " + myCar.modelName);
}
}
จากตัวอย่าง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
class Class1:
def m(self):
print("In Class1")
class Class2(Class1):
def m(self):
print("In Class2")
class Class3(Class1):
def m(self):
print("In Class3")
class Class4(Class2, Class3):
def m(self):
print("In Class4")
obj = Class4()
obj.m()
Class2.m(obj)
Class3.m(obj)
Class1.m(obj)
จะเห็นว่า 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