Abstract class là class được đánh dấu abstract, không thể tạo instance trực tiếp và được dùng làm base class để các class con kế thừa.
Hãy hình dung nó như bản thiết kế khung của một dòng sản phẩm: phần móng, khung, hệ thống điện nước đã làm sẵn (concrete members và state), nhưng một số phòng để trống và yêu cầu đội thi công sau phải hoàn thiện theo đúng quy cách (abstract members).
Về cơ chế, compiler chặn new trên abstract class. Class này có thể chứa field, property, constructor, concrete method, virtual method, và abstract method/property (chỉ khai báo chữ ký, không có body). Class con bắt buộc override tất cả abstract member thì mới trở thành concrete và tạo được instance. Vì C# chỉ cho single inheritance với class, một class chỉ kế thừa được một abstract class nhưng có thể implement nhiều interface. Constructor của abstract class không dùng để tạo object trực tiếp mà được gọi qua base() khi khởi tạo subclass để thiết lập state chung.
abstract class PaymentProcessor
{
protected readonly string MerchantId; // state chung
protected PaymentProcessor(string merchantId) => MerchantId = merchantId;
public void Log(string msg) => Console.WriteLine($"[{MerchantId}] {msg}"); // logic dùng chung
public abstract Task<bool> ChargeAsync(decimal amount); // buộc subclass định nghĩa
}
class MomoProcessor : PaymentProcessor
{
public MomoProcessor(string id) : base(id) {}
public override Task<bool> ChargeAsync(decimal amount) => Task.FromResult(true);
}Lỗi thường gặp:
- Gọi new PaymentProcessor(...) -> lỗi compile.
- Quên override abstract member -> subclass vẫn là abstract, không tạo được instance.
- Đặt logic quá nhiều vào abstract class khiến cây kế thừa cứng nhắc, khó thay đổi; lúc này composition hoặc interface linh hoạt hơn.
- Nhầm lẫn abstract với virtual: virtual đã có implementation và có thể không override, abstract thì bắt buộc.
Lưu ý: Dùng abstract class khi các class có quan hệ is-a rõ ràng và cần chia sẻ state/logic chung; dùng interface khi bạn cần định nghĩa capability cho nhiều nhánh class không liên quan hoặc cần đa kế thừa về hành vi.