menu_book LESSON MODE

OOP Ch.8 — Abstract Classes

calendar_today Đăng 29 May 2026
OOP Ch.8 — Abstract Classes
school

NOW LEARNING

OOP Ch.8 — Abstract Classes

🏗️ OOP Series · Lập trình Hướng đối tượng với Python
📐
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!

📋

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
✅ 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
🔨

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
---
🚫

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
🛡️ 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.
🏦

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!
🌟
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

1️⃣Abstract class import từ đâu?
→ from abc import ABC, abstractmethod
2️⃣Có thể tạo object từ abstract class không?
→ Không — TypeError ngay lập tức
3️⃣Quên implement abstract method thì sao?
→ Python báo lỗi khi tạo object
4️⃣Abstract class có thể có method thường không?
→ Có — chỉ abstract method mới bắt buộc
OOP Series: Chapter 8 / 10
📐
🧩
Tiếp theo · Chapter 9
Composition & Design Patterns
Has-a vs Is-a. Builder, Strategy pattern — tổ chức code OOP chuyên nghiệp như lập trình viên thực thụ!

NEXT STEP

Tiếp theo nên học gì

route