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