Inheritance in C#

ไตรรัตน์ ศรพรหม 650710545

บทนำ

ในส่วนนี้จะมาอธิยายเกี่ยวกับ การสืบทอด (Inheritance) ใน C# ซึ่งจะช่วยให้เรานั้นสามารถสร้างคลาสใหม่ขึ้นมาได้โดยใช้คุณสมบัติต่างๆของคลาสที่มีอยู่แล้ว ซึ่งใน C# จะเรียกว่า คลาสฐาน (Base Class) ส่วนคลาสที่สืบทอดจะเรียกว่า Derived Class โดยคลาสนี้จะได้รับคุณสมบัติ (properties) และพฤติกรรม (methods) จากคลาสฐาน และยังสามารถเพิ่มหรือปรับแต่งฟังก์ชันการทำงานของตัวเองได้อีกด้วย


ข้อดีของการ Inheritance

  1. ช่วยลดความซ้ำซ้อนและทำให้อ่านง่ายขึ้นเพราะไม่จำเป็นต้องเขียนโค้ดเดิมซ้ำซ้อนในคลาสลูกหลายๆตัว

  2. บำรุงรักษาง่ายเพราะการแยกเป็นคลาสต่างๆ และในการสืบทอดนั้นหากแก้อะไรในคลาสฐานจะส่งผลให้คลาสลูกถูกเปลี่ยนแปลงไปด้วย

  3. สามารถแต่งเติมหรือเพิ่มเมธอดหรืออื่นๆในคลาสลูกได้ใหม่จากการสืบทอดซึ่งช่วยให้การพัฒนาโปรแกรมเป็นไปอย่างยืดหยุ่นมากขึ้นและสามารถปรับเปลี่ยนได้ง่ายอีกด้วย


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# กับแต่ละภาษา

Java
Python
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


แหล่งอ้างอิง

Last updated