📐
Abstract Classes
Chapter 8 · OOP Series
Abstract Classes
& Interfaces
Thiết kế theo hợp đồng — ép buộc mọi class con phải thực hiện đúng những gì đã cam kết!
Phần 1 — Abstract Class là gì?
Class hợp đồng — Không thể tạo object trực tiếp!
Abstract Class là class không thể khởi tạo trực tiếp — nó chỉ là bản thiết kế để các class con phải implement đầy đủ.
📜
Như hợp đồng lao động!
Hợp đồng ghi rõ: nhân viên phải làm A, B, C. Không thể thuê "hợp đồng" — chỉ thuê người ký hợp đồng. Abstract Class cũng vậy: class con phải implement đủ method, không thể tạo object từ abstract class!
❌ Abstract Class
• Không thể tạo object
• Chứa abstract methods
• Là "hợp đồng" cần ký
• Dùng ABC làm base
• Chứa abstract methods
• Là "hợp đồng" cần ký
• Dùng ABC làm base
✅ Concrete Class
• Tạo object bình thường
• Implement đủ abstract methods
• Là "người ký hợp đồng"
• Kế thừa từ abstract class
• Implement đủ abstract methods
• Là "người ký hợp đồng"
• Kế thừa từ abstract class
Phần 2 — ABC và @abstractmethod
Cú pháp — import ABC và @abstractmethod
from abc import ABC, abstractmethod class HinhDang(ABC): ← kế thừa ABC = trở thành abstract @abstractmethod def dien_tich(self): ← class con BẮT BUỘC implement! pass @abstractmethod def chu_vi(self): pass def mo_ta(self): ← method thường — không bắt buộc print(f"Diện tích: {self.dien_tich():.2f}") print(f"Chu vi : {self.chu_vi():.2f}") # ❌ Không thể tạo object abstract class! # h = HinhDang() → TypeError! class HinhVuong(HinhDang): def __init__(self, canh): self.canh = canh def dien_tich(self): return self.canh ** 2 def chu_vi(self): return self.canh * 4 class HinhTron(HinhDang): def __init__(self, r): self.r = r def dien_tich(self): return 3.14159 * self.r ** 2 def chu_vi(self): return 2 * 3.14159 * self.r for h in [HinhVuong(5), HinhTron(4)]: h.mo_ta() print("---")
Diện tích: 25.00
Chu vi : 20.00
---
Diện tích: 50.27
Chu vi : 25.13
---
Chu vi : 20.00
---
Diện tích: 50.27
Chu vi : 25.13
---
Phần 3 — Vi phạm hợp đồng → Lỗi ngay!
Quên implement abstract method — Python báo lỗi!
Nếu class con kế thừa abstract class mà không implement đủ abstract methods, Python từ chối tạo object:
class HinhTamGiac(HinhDang): def __init__(self, a, b, c): self.a=a; self.b=b; self.c=c def chu_vi(self): return self.a + self.b + self.c # ← QUÊN implement dien_tich()! # ❌ Lỗi ngay lập tức! t = HinhTamGiac(3, 4, 5)
TypeError: Can't instantiate abstract class HinhTamGiac
with abstract method dien_tich
with abstract method dien_tich
🛡️ Bắt lỗi ngay lúc tạo object — không phải lúc chạy! Điều này giúp phát hiện bug sớm thay vì sau này gặp lỗi khó tìm hơn.
Phần 4 — Abstract class trong thực tế
Thiết kế hệ thống Thanh Toán chuẩn
from abc import ABC, abstractmethod class CongThanhToan(ABC): ← hợp đồng cho mọi cổng TT @abstractmethod def ket_noi(self) -> bool: pass @abstractmethod def thanh_toan(self, so_tien) -> bool: pass @abstractmethod def hoan_tien(self, so_tien) -> bool: pass def xu_ly_giao_dich(self, so_tien): ← template method! if not self.ket_noi(): print("❌ Kết nối thất bại"); return if self.thanh_toan(so_tien): print(f"✅ Giao dịch {so_tien:,}đ thành công!") else: print("❌ Giao dịch thất bại!") class VNPay(CongThanhToan): def ket_noi(self): print("🔌 VNPay: Kết nối...") return True def thanh_toan(self, st): print(f"💳 VNPay: Xử lý {st:,}đ") return True def hoan_tien(self, st): print(f"↩️ VNPay: Hoàn {st:,}đ"); return True class MoMo(CongThanhToan): def ket_noi(self): print("🔌 MoMo: Kết nối ví...") return True def thanh_toan(self, st): print(f"🍇 MoMo: -{st:,}đ từ ví") return True def hoan_tien(self, st): print(f"↩️ MoMo: Hoàn ví +{st:,}đ"); return True for cong in [VNPay(), MoMo()]: cong.xu_ly_giao_dich(150_000) print()
🔌 VNPay: Kết nối...
💳 VNPay: Xử lý 150,000đ
✅ Giao dịch 150,000đ thành công!
🔌 MoMo: Kết nối ví...
🍇 MoMo: -150,000đ từ ví
✅ Giao dịch 150,000đ thành công!
💳 VNPay: Xử lý 150,000đ
✅ Giao dịch 150,000đ thành công!
🔌 MoMo: Kết nối ví...
🍇 MoMo: -150,000đ từ ví
✅ Giao dịch 150,000đ thành công!
Template Method Pattern! Method
xu_ly_giao_dich() định nghĩa trình tự (kết nối → thanh toán → báo kết quả), còn từng bước do class con tự implement. Đây là design pattern cực kỳ hữu dụng!🧩 Kiểm tra nhanh!
Chapter 8 — Abstract Classes
Abstract class import từ đâu?
→ from abc import ABC, abstractmethod
→ from abc import ABC, abstractmethod
Có thể tạo object từ abstract class không?
→ Không — TypeError ngay lập tức
→ Không — TypeError ngay lập tức
Quên implement abstract method thì sao?
→ Python báo lỗi khi tạo object
→ Python báo lỗi khi tạo object
Abstract class có thể có method thường không?
→ Có — chỉ abstract method mới bắt buộc
→ Có — chỉ abstract method mới bắt buộc