🎭
Polymorphism
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!
Phần 1 — Polymorphism là gì?
"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ần 2 — Polymorphism qua Method Override
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! 🐄
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ũ!Phần 3 — Duck Typing
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
Phần 4 — Bài tập: Hệ thống thanh toán
🚀 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đ
💵 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
Polymorphism nghĩa là gì?
→ Cùng interface, nhiều hành vi khác nhau
→ Cùng interface, nhiều hành vi khác nhau
Duck Typing là gì?
→ Không quan tâm loại object, chỉ cần có method
→ Không quan tâm loại object, chỉ cần có method
Lợi ích của Polymorphism?
→ Thêm class mới không sửa code cũ
→ Thêm class mới không sửa code cũ
Polymorphism dựa trên kỹ thuật gì?
→ Method override + inheritance
→ Method override + inheritance