Merancang untuk pewarisan dan polimorfisme

Pemrograman Berorientasi Objek di Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polimorfisme

 

 

Menggunakan antarmuka terpadu untuk mengoperasikan objek dari kelas yang berbeda

Pemrograman Berorientasi Objek di Python

hierarki kelas akun

Pemrograman Berorientasi Objek di Python

Yang penting adalah antarmuka

# Tarik jumlah dari setiap akun dalam 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]) # <-- Akan menggunakan BankAccount.withdraw(), # lalu CheckingAccount.withdraw(), # lalu SavingsAccount.withdraw()
  • batch_withdraw() tidak perlu memeriksa objek untuk mengetahui withdraw() mana yang akan dipanggil
Pemrograman Berorientasi Objek di Python

Prinsip substitusi Liskov

 

Kelas dasar harus dapat dipertukarkan dengan subkelasnya tanpa mengubah properti program

Di mana pun BankAccount berfungsi, CheckingAccount juga harus berfungsi

foto Barbara Liskov

Pemrograman Berorientasi Objek di Python

Prinsip substitusi Liskov

 

Kelas dasar harus dapat dipertukarkan dengan subkelasnya tanpa mengubah properti program

Secara Sintaksis
  • tanda tangan fungsi kompatibel
    • argumen, nilai yang dikembalikan
Secara Semantik
  • keadaan objek dan program tetap konsisten
    • metode subkelas tidak memperkuat kondisi input
    • metode subkelas tidak melemahkan kondisi output
    • tidak ada pengecualian tambahan
Pemrograman Berorientasi Objek di Python

Melanggar LSP

Ketidakcocokan Sintaksis

BankAccount.withdraw() memerlukan 1 parameter, tetapi CheckingAccount.withdraw() memerlukan 2

Subkelas memperkuat kondisi input

BankAccount.withdraw() menerima jumlah berapa pun, tetapi CheckingAccount.withdraw() mengasumsikan jumlah terbatas

Subkelas melemahkan kondisi output

BankAccount.withdraw() hanya dapat meninggalkan saldo positif atau menyebabkan kesalahan, CheckingAccount.withdraw() dapat meninggalkan saldo negatif

Pemrograman Berorientasi Objek di Python

Melanggar LSP

→ Mengubah atribut tambahan dalam metode subkelas

→ Melempar pengecualian tambahan dalam metode subkelas

Pemrograman Berorientasi Objek di Python

 

 

 

 

$$\text{\textbf{\Huge{Tidak ada LSP -- Tidak ada Pewarisan}}}$$

Pemrograman Berorientasi Objek di Python

Mari berlatih!

Pemrograman Berorientasi Objek di Python

Preparing Video For Download...