ทั้ง Abstract Class และ Interface ใช้กำหนดสัญญา (Contract) ให้คลาสลูกปฏิบัติ แต่มีความแตกต่างในความสามารถและเจตนา
ตารางเปรียบเทียบ
| คุณสมบัติ | Abstract Class | Interface |
|---|---|---|
| Multiple Inheritance | ไม่ได้ (Single Inheritance) | ได้ (Implement หลาย Interface) |
| Fields (Instance) | มีได้ (State) | ไม่มี (C# 8- ไม่มี, C# 8+ มี static fields เท่านั้น) |
| Constructors | มีได้ | ไม่มี |
| Access Modifiers | มีได้ทั้งหมด (public, protected, private, internal) | Default public (C# 8+ มี private/protected สำหรับ Default Implementation) |
| Method Implementation | มีได้ (Virtual, Abstract, Concrete) | C# 8-: แค่ Declaration | C# 8+: Default Implementation ได้ |
| Static Members | มีได้ | C# 8+: มีได้ (Static Abstract/Methods) |
| วัตถุประสงค์ | "Is-A" Base Class, Shared Implementation | "Can-Do" Contract, Capability |
Abstract Class
public abstract class Animal
{
// Field (State)
protected string Name;
// Constructor
protected Animal(string name) => Name = name;
// Abstract Method (ต้อง Override)
public abstract void MakeSound();
// Virtual Method (Override ได้ ไม่บังคับ)
public virtual void Sleep() => Console.WriteLine($"{Name} sleeping...");
// Concrete Method
public void Eat() => Console.WriteLine($"{Name} eating");
}
public class Dog : Animal
{
public Dog(string name) : base(name) { }
public override void MakeSound() => Console.WriteLine("Woof!");
}
Interface (C# 8+ Features)
public interface IAnimal
{
// Properties
string Name { get; set; }
// Methods (Implicit public)
void MakeSound();
// Default Implementation (C# 8+)
void Sleep() => Console.WriteLine($"{Name} sleeping...");
// Static Members (C# 8+)
static int Count { get; set; }
static void ResetCount() => Count = 0;
}
เมื่อไหร่ใช้ตัวไหน?
- Abstract Class: มี Shared State/Implementation, "Is-A" Relationship ชัดเจน, ต้องการ Constructor, Versioning (เพิ่ม Method ไม่ Breaking)
- Interface: "Can-Do" Capability, Multiple Implementation, Dependency Injection, Plugin Architecture, ไม่มี Shared State
หลักการ: "Program to Interfaces" - ใช้ Interface กำหนด Contract ใช้ Abstract Class แชร์ Implementation