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

Abstract Class vs Interface ใน C#: ความแตกต่าง

ทั้ง Abstract Class และ Interface ใช้กำหนดสัญญา (Contract) ให้คลาสลูกปฏิบัติ แต่มีความแตกต่างในความสามารถและเจตนา

ตารางเปรียบเทียบ

คุณสมบัติAbstract ClassInterface
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