Проєктування для наслідування та поліморфізму

Об'єктноорієнтоване програмування в Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Поліморфізм

 

 

Єдиний інтерфейс для роботи з об'єктами різних класів

Об'єктноорієнтоване програмування в Python

ієрархія класів account

Об'єктноорієнтоване програмування в Python

Важливий лише інтерфейс

# 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

Принцип підстановки Лісков

 

Базовий клас має бути взаємозамінним із будь-яким підкласом без зміни властивостей програми

Де працює BankAccount, там має працювати і CheckingAccount

фото Барбари Лісков

Об'єктноорієнтоване програмування в Python

Принцип підстановки Лісков

 

Базовий клас має бути взаємозамінним із будь-яким підкласом без зміни властивостей програми

Синтаксично
  • сигнатури функцій сумісні
    • аргументи, повернені значення
Семантично
  • стан об'єкта й програми лишається узгодженим
    • метод підкласу не посилює вимоги до вхідних даних
    • метод підкласу не послаблює умови виходу
    • без додаткових винятків
Об'єктноорієнтоване програмування в Python

Порушення LSP

Синтаксична несумісність

BankAccount.withdraw() потребує 1 параметр, а CheckingAccount.withdraw() — 2

Підклас посилює вхідні умови

BankAccount.withdraw() приймає будь-яку суму, а CheckingAccount.withdraw() вважає, що сума обмежена

Підклас послаблює вихідні умови

BankAccount.withdraw() може лишити лише додатний баланс або спричинити помилку, CheckingAccount.withdraw() може лишити від'ємний баланс

Об'єктноорієнтоване програмування в Python

Порушення LSP

→ Зміна додаткових атрибутів у методі підкласу

→ Генерування додаткових винятків у методі підкласу

Об'єктноорієнтоване програмування в Python

 

 

 

 

$$\text{\textbf{\Huge{Немає LSP — немає наслідування}}}$$

Об'єктноорієнтоване програмування в Python

Давайте потренуємось!

Об'єктноорієнтоване програмування в Python

Preparing Video For Download...