Наведіть приклад дотримання LSP
Приклад дотримання LSP - це ситуація, коли підклас розширює поведінку батьківського класу, не порушуючи його контракт, і може повністю замінити базовий клас у клієнтському коді.
Нижче коректний приклад: базовий клас описує інтерфейс сповіщення, а підкласи реалізують різні способи відправки.
Базовий клас (контракт)
python
class Notifier:
def send(self, message: str):
raise NotImplementedErrorПідкласи, які дотримуються LSP
python
class EmailNotifier(Notifier):
def send(self, message: str):
print(f"Відправлення email: {message}")
class SmsNotifier(Notifier):
def send(self, message: str):
print(f"Відправлення SMS: {message}")Чому це дотримується LSP:
- Підкласи не змінюють сенс методу
send()Вони просто реалізують його по-своєму. Базовий контракт: «відправити повідомлення». Обидва підкласи дотримуються цього контракту. - Підкласи не посилюють вхідні обмеження Метод приймає будь-який рядок - і Email, і SMS приймають будь-який рядок.
- Підкласи не послаблюють гарантії результату Обіцянка базового класу: «операція відправки виконується». Обидві реалізації виконують це.
- Немає потреби перевіряти тип
Клієнтський код:
python
def notify(notifier: Notifier, msg):
notifier.send(msg)Можна підставити будь-який підклас:
python
notify(EmailNotifier(), "Привіт!")
notify(SmsNotifier(), "Привіт!")І програма буде працювати коректно і передбачувано, без змін.
- Не порушуються інваріанти У базового класу взагалі немає стану, а отже, нащадки нічого не псують.
Підсумок
Класи EmailNotifier і SmsNotifier повністю зберігають контракт Notifier, не змінюють сенс поведінки і можуть безпечно використовуватися там, де очікується базовий тип - це і є коректне дотримання LSP.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.