menu_book LESSON MODE

OOP Ch.5 — Polymorphism

calendar_today Đăng 29 May 2026
OOP Ch.5 — Polymorphism
school

NOW LEARNING

OOP Ch.5 — Polymorphism

🏗️ OOP Series · Lập trình Hướng đối tượng với Python
🎭
Chapter 5 · OOP Series

Polymorphism
— Đa Hình

Cùng một lời gọi, nhiều hành vi khác nhau — sức mạnh thực sự của lập trình hướng đối tượng!

🎭

"Nhiều hình dạng" — Một interface, nhiều kết quả

Polymorphism (đa hình) cho phép các object khác nhau phản hồi cùng một lời gọi method theo cách riêng của chúng.

🔊
Lệnh "Phát âm thanh!" — mỗi loài một tiếng! Bạn nói "Phát âm" với chó → "Gâu!", mèo → "Meo!", bò → "Moo!". Cùng một lệnh, ba phản hồi khác nhau. Đó chính là Polymorphism!
🗣️ goi_am_thanh(dong_vat)
🐕
Cho
"Gâu gâu!"
🐈
Meo
"Meo meo!"
🐄
Bo
"Moo moo!"
🐸
Ech
"Ộp ộp!"
→ Cùng method .phat_am() — 4 kết quả khác nhau
🔄

Phổ biến nhất: Override cùng method

class DongVat:
    def __init__(self, ten): self.ten = ten
    def phat_am(self): return "..."      ← mặc định

class Cho(DongVat):
    def phat_am(self): return f"{self.ten}: Gâu gâu! 🐕"

class Meo(DongVat):
    def phat_am(self): return f"{self.ten}: Meo meo! 🐈"

class Bo(DongVat):
    def phat_am(self): return f"{self.ten}: Moo moo! 🐄"

# ✨ Polymorphism trong hành động!
trang_trai = [Cho("Rex"), Meo("Kitty"), Bo("Daisy")]

for dong_vat in trang_trai:
    print(dong_vat.phat_am())     ← cùng lời gọi, khác kết quả!
Rex: Gâu gâu! 🐕
Kitty: Meo meo! 🐈
Daisy: Moo moo! 🐄
💡 Code gọi phat_am() không cần biết object là loại gì — Python tự tìm đúng method. Đây chính là sức mạnh: thêm loài mới chỉ cần thêm class, không sửa code cũ!
🦆

Duck Typing — "Nếu đi như vịt thì là vịt!"

🦆 "If it walks like a duck and quacks like a duck, it's a duck!"
Python không quan tâm object thuộc class gì — chỉ cần nó có method được gọi là đủ! Không cần kế thừa chung class cha.
# Không cần kế thừa chung — chỉ cần có method dien_tich()!
class HinhVuong:
    def __init__(self, c): self.c = c
    def dien_tich(self): return self.c ** 2

class HinhTron:
    def __init__(self, r): self.r = r
    def dien_tich(self): return 3.14 * self.r ** 2

class HinhChuNhat:
    def __init__(self, d, r): self.d=d; self.r=r
    def dien_tich(self): return self.d * self.r

def tong_dien_tich(ds_hinh):         ← không quan tâm loại gì!
    return sum(h.dien_tich() for h in ds_hinh)

hinh = [HinhVuong(4), HinhTron(3), HinhChuNhat(5,6)]
print(f"Tổng diện tích: {tong_dien_tich(hinh):.2f}")
Tổng diện tích: 74.26
🚀 Dự án nhỏ

Hệ thống thanh toán đa phương thức

class PhuongThucTT:
    def thanh_toan(self, so_tien): pass
    def hoan_tien(self, so_tien):  pass

class TienMat(PhuongThucTT):
    def thanh_toan(self, so_tien):
        print(f"💵 Tiền mặt: {so_tien:,}đ — OK ngay!")
    def hoan_tien(self, so_tien):
        print(f"💵 Hoàn tiền mặt: {so_tien:,}đ")

class TheNganHang(PhuongThucTT):
    def __init__(self, so_the):
        self.so_the = so_the[-4:]
    def thanh_toan(self, so_tien):
        print(f"💳 Thẻ *{self.so_the}: {so_tien:,}đ — Đang xử lý...")
    def hoan_tien(self, so_tien):
        print(f"💳 Hoàn thẻ *{self.so_the}: {so_tien:,}đ (3-5 ngày)")

class MoMo(PhuongThucTT):
    def __init__(self, sdt): self.sdt = sdt
    def thanh_toan(self, so_tien):
        print(f"🍇 MoMo {self.sdt}: -{so_tien:,}đ")
    def hoan_tien(self, so_tien):
        print(f"🍇 Hoàn ví MoMo: +{so_tien:,}đ (tức thì!)")

def xu_ly_don_hang(pt_thanh_toan, gia_tien):
    print(f"\n📦 Đơn hàng {gia_tien:,}đ:")
    pt_thanh_toan.thanh_toan(gia_tien)     ← Polymorphism!

xu_ly_don_hang(TienMat(),                   250_000)
xu_ly_don_hang(TheNganHang("1234567890124321"), 450_000)
xu_ly_don_hang(MoMo("0901234567"),           180_000)
📦 Đơn hàng 250,000đ:
💵 Tiền mặt: 250,000đ — OK ngay!

📦 Đơn hàng 450,000đ:
💳 Thẻ *4321: 450,000đ — Đang xử lý...

📦 Đơn hàng 180,000đ:
🍇 MoMo 0901234567: -180,000đ
🌟
Thêm phương thức thanh toán mới — không sửa code cũ! Muốn thêm ZaloPay, VNPay? Chỉ cần tạo class mới kế thừa PhuongThucTT. Hàm xu_ly_don_hang() không cần sửa!

🧩 Kiểm tra nhanh!

Chapter 5 — Polymorphism

1️⃣Polymorphism nghĩa là gì?
→ Cùng interface, nhiều hành vi khác nhau
2️⃣Duck Typing là gì?
→ Không quan tâm loại object, chỉ cần có method
3️⃣Lợi ích của Polymorphism?
→ Thêm class mới không sửa code cũ
4️⃣Polymorphism dựa trên kỹ thuật gì?
→ Method override + inheritance
OOP Series: Chapter 5 / 10
🎭
Tiếp theo · Chapter 6
Magic Methods — Phép Thuật Python
__str__, __len__, __add__, __eq__ — làm cho object của bạn hoạt động như built-in Python!

NEXT STEP

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

route