Як реалізувати OCP через успадкування?
OCP через успадкування реалізується так, що базовий клас лишається незмінним, а нова поведінка додається у вигляді підкласів, які перевизначають потрібні методи. Таким чином, розширення відбувається за рахунок нових класів, а не зміни старих.
Детальніше:
1. Базовий клас задає спільний інтерфейс
У ньому визначаються методи, які дочірні класи повинні реалізувати. Цей клас лишається «закритим для модифікації»: його код не змінюється при появі нових варіантів поведінки.
2. Нові типи поведінки створюються через нових нащадків
Коли потрібен новий функціонал, створюється новий підклас, який реалізує або перевизначає потрібні методи. Це забезпечує «відкритість для розширення»: поведінка системи зростає, не змінюючи наявні файли.
3. Клієнтський код працює через базовий тип
Незалежно від того, скільки підкласів існує, зовнішній код використовує тільки базовий інтерфейс. Це означає, що додавання нових реалізацій не вимагає змін у логіці, яка викликає ці об'єкти.
Приклад:
class PaymentMethod:
def pay(self, amount):
raise NotImplementedErrorДочірні класи:
class CardPayment(PaymentMethod):
def pay(self, amount):
print("Оплата карткою:", amount)
class PayPalPayment(PaymentMethod):
def pay(self, amount):
print("Оплата через PayPal:", amount)Розширення:
class CryptoPayment(PaymentMethod):
def pay(self, amount):
print("Оплата криптовалютою:", amount)Чому це відповідає OCP
- Базовий клас не змінювався Він лишився закритим для модифікації.
- Нова поведінка додана через нового нащадка CryptoPayment - новий варіант, який не вимагає переписування старих класів.
- Клієнтський код використовує єдиний інтерфейс Наприклад:
def checkout(payment: PaymentMethod, amount):
payment.pay(amount)Цей код не потребує змін при додаванні нових способів оплати.
Підсумок: Успадкування реалізує OCP, коли базовий клас задає контракт, а нова поведінка додається виключно шляхом створення нових підкласів, не змінюючи наявні.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.