Immagina, ho classe IAlgo
che è un'interfaccia. Ne ho ricavato e ho implementato il suo unico metodo chiamato matchCount
in diverse implementazioni: AlgoA1
, AlgoA2
, AlgoA3
, AlgoB1
, AlgoB2
.
class IAlgo
{
virtual int matchCount(T1* p1, T2* p2) = 0;
}
class AlgoA1 : public IAlgo
{
virtual int matchCount(T1* p1, T2* p2) override
{
// impl here
}
}
La differenza tra AlgoAN
e AlgoBK
è che la categoria A
è interessata a tutti i parametri di matchCount
e la categoria B
è interessata solo al primo param e il resto può essere nullo - categoria B
non li usa.
Quindi, come algoritmo incapsulato, li sto usando nel modello di strategia. Dopo qualche tempo, il proprietario del prodotto dice che desidera un nuovo tipo di algoritmi ( AlgoC
category) che aggiunge un nuovo parametro al metodo matchCount
- ad esempio T3*
. Quindi dovremmo tornare indietro e modificare l'intera gerarchia di IAlgo
e tutte le sottoclassi avranno il seguente formato:
virtual int matchCount(T1* p1, T2* p2, T3* p3) = 0;
Questo è un problema di progettazione e sembra che io abbia avuto un algoritmo incapsulato per usarlo come strategia, ma non ha funzionato. Come devo risolvere questo problema? Il mio problema è il fatto che le famiglie AlgoA
, AlgoB
e AlgoC
non sono correlate e non dovrebbero derivare da IAlgo
e non hanno una relazione "IS A"? Devo avere interfacce diverse IAlgoA
, IAlgoB
e IAlgoC
per famiglie diverse? O tutto questo va bene e ho bisogno di qualche altra soluzione?