Ho letto che quando si utilizza il modello di strategia, è necessario attenersi alla composizione piuttosto che all'ereditarietà. Ma questo significa che qualsiasi eredità è una cattiva pratica? Se c'è una funzionalità da condividere tra strategie simili è anacronistico implementare una classe base per incapsulare quella funzionalità? Di seguito è riportato un esempio che potrebbe essere migliore, ma spero che illustri la mia domanda.
from abc import ABC, abstractmethod
class AdditionStrategyInterface(ABC):
@abstractmethod
def add(self, num1, num2):
raise NotImplementedError
class AdditionStrategy(AdditionStrategyInterface):
def add(self, num1, num2):
return num1 + num2
class AdditionPlusFourStrategyBase(AdditionStrategyInterface, ABC):
def add_four(self, num):
return num + 4
@abstractmethod
def add(self, num1, num2):
raise NotImplementedError
class AdditionPlusFourStrategy(AdditionPlusFourStrategyBase):
def add(self, num1, num2):
return self.add_four(num1 + num2)
class AdditionPlusEightStrategy(AdditionPlusFourStrategyBase):
def add(self, num1, num2):
return self.add_four(self.add_four(num1 + num2))