Skip to main content

Наведіть приклад дотримання 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:

  1. Підкласи не змінюють сенс методу send() Вони просто реалізують його по-своєму. Базовий контракт: «відправити повідомлення». Обидва підкласи дотримуються цього контракту.
  2. Підкласи не посилюють вхідні обмеження Метод приймає будь-який рядок - і Email, і SMS приймають будь-який рядок.
  3. Підкласи не послаблюють гарантії результату Обіцянка базового класу: «операція відправки виконується». Обидві реалізації виконують це.
  4. Немає потреби перевіряти тип

Клієнтський код:

python
def notify(notifier: Notifier, msg): notifier.send(msg)

Можна підставити будь-який підклас:

python
notify(EmailNotifier(), "Привіт!") notify(SmsNotifier(), "Привіт!")

І програма буде працювати коректно і передбачувано, без змін.

  1. Не порушуються інваріанти У базового класу взагалі немає стану, а отже, нащадки нічого не псують.

Підсумок

Класи EmailNotifier і SmsNotifier повністю зберігають контракт Notifier, не змінюють сенс поведінки і можуть безпечно використовуватися там, де очікується базовий тип - це і є коректне дотримання LSP.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.