การออกแบบสำหรับ Inheritance และ Polymorphism

การเขียนโปรแกรมเชิงวัตถุใน Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polymorphism

 

 

การใช้ Interface เดียวกันกับออบเจ็กต์ต่างคลาส

การเขียนโปรแกรมเชิงวัตถุใน Python

ลำดับชั้นของคลาสบัญชี

การเขียนโปรแกรมเชิงวัตถุใน Python

สิ่งที่สำคัญคือ Interface

# 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() ไม่จำเป็นต้องตรวจสอบออบเจ็กต์เพื่อรู้ว่าจะเรียก withdraw() ตัวไหน
การเขียนโปรแกรมเชิงวัตถุใน Python

หลักการ Liskov Substitution

 

Base class ควรแทนที่ subclass ใดก็ได้โดยไม่เปลี่ยนพฤติกรรมของโปรแกรม

ที่ใดที่ใช้ BankAccount ได้ CheckingAccount ก็ควรใช้ได้เช่นกัน

ภาพถ่ายของ Barbara Liskov

การเขียนโปรแกรมเชิงวัตถุใน Python

หลักการ Liskov Substitution

 

Base class ควรแทนที่ subclass ใดก็ได้โดยไม่เปลี่ยนพฤติกรรมของโปรแกรม

ด้านไวยากรณ์
  • signature ของฟังก์ชันต้องเข้ากันได้
    • อาร์กิวเมนต์และค่าที่คืนกลับ
ด้านความหมาย
  • สถานะของออบเจ็กต์และโปรแกรมต้องคงเดิม
    • เมธอดของ subclass ต้องไม่เพิ่มเงื่อนไข input
    • เมธอดของ subclass ต้องไม่ลดเงื่อนไข output
    • ต้องไม่มี exception เพิ่มเติม
การเขียนโปรแกรมเชิงวัตถุใน Python

การละเมิด LSP

ความไม่เข้ากันด้านไวยากรณ์

BankAccount.withdraw() รับ 1 พารามิเตอร์ แต่ CheckingAccount.withdraw() ต้องการ 2

Subclass เพิ่มเงื่อนไข input

BankAccount.withdraw() รับจำนวนเงินใดก็ได้ แต่ CheckingAccount.withdraw() จำกัดจำนวนเงิน

Subclass ลดเงื่อนไข output

BankAccount.withdraw() คงยอดเงินเป็นบวกหรือแจ้ง error แต่ CheckingAccount.withdraw() อาจทำให้ยอดเงินติดลบได้

การเขียนโปรแกรมเชิงวัตถุใน Python

การละเมิด LSP

→ การแก้ไข attribute เพิ่มเติมในเมธอดของ subclass

→ การโยน exception เพิ่มเติมในเมธอดของ subclass

การเขียนโปรแกรมเชิงวัตถุใน Python

 

 

 

 

$$\text{\textbf{\Huge{No LSP -- No Inheritance}}}$$

การเขียนโปรแกรมเชิงวัตถุใน Python

มาฝึกกันเถอะ!

การเขียนโปรแกรมเชิงวัตถุใน Python

Preparing Video For Download...