Thiết kế cho kế thừa và đa hình

Lập trình hướng đối tượng trong Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Đa hình

 

 

Dùng một giao diện thống nhất để thao tác với đối tượng của các lớp khác nhau

Lập trình hướng đối tượng trong Python

phân cấp các lớp tài khoản

Lập trình hướng đối tượng trong Python

Chỉ cần đúng giao diện

# Withdraw amount from each of accounts in list_of_accounts
def batch_withdraw(list_of_accounts, amount):
   for acct in list_of_accounts:
      acct.withdraw(amount)

b, c, s = BankAccount(1000), CheckingAccount(2000), SavingsAccount(3000) batch_withdraw([b,c,s]) # <-- Will use BankAccount.withdraw(), # then CheckingAccount.withdraw(), # then SavingsAccount.withdraw()
  • batch_withdraw() không cần kiểm tra đối tượng để biết gọi withdraw() nào
Lập trình hướng đối tượng trong Python

Nguyên lý thay thế Liskov

 

Lớp cơ sở phải có thể thay thế bằng bất kỳ lớp dẫn xuất nào mà không làm thay đổi hành vi của chương trình

Ở đâu BankAccount dùng được, CheckingAccount cũng phải dùng được

ảnh Barbara Liskov

Lập trình hướng đối tượng trong Python

Nguyên lý thay thế Liskov

 

Lớp cơ sở phải có thể thay thế bằng bất kỳ lớp dẫn xuất nào mà không làm thay đổi hành vi của chương trình

Về cú pháp
  • chữ ký hàm tương thích
    • tham số, giá trị trả về
Về ngữ nghĩa
  • trạng thái của đối tượng và chương trình vẫn nhất quán
    • phương thức của lớp con không siết chặt điều kiện đầu vào
    • phương thức của lớp con không nới lỏng điều kiện đầu ra
    • không có ngoại lệ bổ sung
Lập trình hướng đối tượng trong Python

Vi phạm LSP

Không tương thích cú pháp

BankAccount.withdraw() cần 1 tham số, nhưng CheckingAccount.withdraw() cần 2

Lớp con siết chặt điều kiện đầu vào

BankAccount.withdraw() chấp nhận mọi số tiền, nhưng CheckingAccount.withdraw() giả định số tiền bị giới hạn

Lớp con nới lỏng điều kiện đầu ra

BankAccount.withdraw() chỉ để lại số dư dương hoặc báo lỗi, CheckingAccount.withdraw() có thể để số dư âm

Lập trình hướng đối tượng trong Python

Vi phạm LSP

→ Thay đổi thêm thuộc tính trong phương thức của lớp con

→ Ném thêm ngoại lệ trong phương thức của lớp con

Lập trình hướng đối tượng trong Python

 

 

 

 

$$\text{\textbf{\Huge{Không có LSP — không có kế thừa}}}$$

Lập trình hướng đối tượng trong Python

Ayo berlatih!

Lập trình hướng đối tượng trong Python

Preparing Video For Download...