Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Abstract Classes ใน C# - คลาสนามธรรมฉบับสมบูรณ์

Abstract Class คืออะไร?

Abstract Class เป็นคลาสที่ประกาศด้วยคีย์เวิร์ด abstract ใช้เป็น Base Class (คลาสฐาน) ที่กำหนดโครงสร้างร่วมให้คลาสลูก (Derived Classes) สืบทอดและนำไปใช้งาน

ลักษณะสำคัญ

  • ประกอบด้วย Abstract Members (ไม่มี implementation) และ Concrete Members (มี implementation) ได้
  • ไม่สามารถสร้างอินสแตนซ์ได้โดยตรง (ไม่สามารถ `new AbstractClass()` ได้)
  • คลาสลูก บังคับต้อง implement abstract members ทั้งหมด (ยกเว้นคลาสลูกก็เป็น abstract)
  • ใช้สำหรับการออกแบบ "Is-a" relationship ที่ชัดเจน

ตัวอย่างโครงสร้างพื้นฐาน

public abstract class Vehicle
{
    // Abstract method - บังคับ override
    public abstract void Display();
    
    // Concrete method - ใช้ร่วมได้
    public void StartEngine()
    {
        Console.WriteLine("Engine started");
    }
    
    // Abstract property
    public abstract int MaxSpeed { get; }
    
    // Concrete property
    public string Brand { get; set; }
}

การ Implement ในคลาสลูก

Bus.cs

public class Bus : Vehicle
{
    public override void Display()
    {
        Console.WriteLine("Bus - Max Speed: " + MaxSpeed);
    }
    
    public override int MaxSpeed => 100;
}

Car.cs

public class Car : Vehicle
{
    public override void Display()
    {
        Console.WriteLine("Car - Brand: " + Brand);
    }
    
    public override int MaxSpeed => 200;
}

Motorcycle.cs

public class Motorcycle : Vehicle
{
    public override void Display()
    {
        Console.WriteLine("Motorcycle");
    }
    
    public override int MaxSpeed => 180;
}

ตัวอย่างโค้ดสมบูรณ์

using System;

public abstract class Vehicle
{
    public abstract void Display();
}

public class Bus : Vehicle
{
    public override void Display()
    {
        Console.WriteLine("Bus");
    }
}

public class Car : Vehicle
{
    public override void Display()
    {
        Console.WriteLine("Car");
    }
}

public class Motorcycle : Vehicle
{
    public override void Display()
    {
        Console.WriteLine("Motorcycle");
    }
}

public class Program
{
    public static void Main()
    {
        Vehicle v;
        
        v = new Bus();
        v.Display();
        
        v = new Car();
        v.Display();
        
        v = new Motorcycle();
        v.Display();
    }
}

ผลลัพธ์

Bus
Car
Motorcycle

Polymorphism กับ Abstract Class

Abstract Class ช่วยให้ทำ Polymorphism ได้อย่างเต็มที่

List vehicles = new List
{
    new Bus(),
    new Car(),
    new Motorcycle()
};

foreach (var vehicle in vehicles)
{
    vehicle.Display(); // เรียกเมธอดที่ override แล้ว
    vehicle.StartEngine(); // เรียกเมธอดร่วมของ base class
}

Abstract Class vs Interface

คุณสมบัติ Abstract Class Interface
Multiple Inheritance ❌ ได้แค่ 1 คลาส ✅ ได้หลาย Interface
Fields/State ✅ มีได้ ❌ ไม่มี (C# 8-)
Constructors ✅ มีได้ ❌ ไม่มี
Access Modifiers ✅ ทุกอย่าง ✅ public/default (C# 8+)
Implementation ✅ มีได้ ✅ Default implementation (C# 8+)
วัตถุประสงค์ "Is-a" แบบมีโค้ดร่วม "Can-do" / Contract

เมื่อไหร่ควรใช้ Abstract Class?

  • มีโค้ดร่วม (shared code) ที่คลาสลูกใช้ร่วมกัน
  • ต้องการ fields/state ใน base class
  • ต้องการ constructors
  • สร้าง hierarchy แบบ "Is-a" ที่ชัดเจน (Animal → Dog, Cat)
  • ต้องการควบคุมการ instantiate (factory pattern)

Sealed Abstract Class?

ไม่สามารถ** รวม abstract และ sealed ได้ เพราะขัดแย้งกัน:

  • abstract = บังคับสืบทอด
  • sealed = ห้ามสืบทอด

สรุป

  • Abstract Class = Base class ที่ไม่สามารถ new ได้ ต้องสืบทอด
  • มี Abstract Members (บังคับ override) และ Concrete Members (ใช้ร่วมได้)
  • เหมาะสำหรับ "Is-a" hierarchy ที่มีโค้ดร่วม
  • ต่างจาก Interface ที่เน้น Contract และ Multiple Implementation