Proveniente da uno sfondo C++, Im è utilizzato per ereditarietà multipla. Mi piace la sensazione di un fucile puntato esattamente al mio piede. Oggigiorno, lavoro di più in C# e in Java, dove puoi ereditare solo una baseclass ma implementare un numero qualsiasi di interfacce (ho avuto la terminologia giusta?).Modello di progettazione da utilizzare al posto dell'ereditarietà multipla
Ad esempio, immobili considerare due classi che implementano un'interfaccia comune, ma differenti baseclasses (ancora necessarie):
public class TypeA : CustomButtonUserControl, IMagician
{
public void DoMagic()
{
// ...
}
}
public class TypeB : CustomTextUserControl, IMagician
{
public void DoMagic()
{
// ...
}
}
Entrambe le classi sono UserControl
s così non posso sostituire la classe di base. Entrambi devono implementare la funzione DoMagic
. Il mio problema ora è che entrambe le implementazioni della funzione sono identiche. E odio il codice copia-e-incolla.
I (possibili) soluzioni:
- ho naturalmente vogliono
TypeA
eTypeB
di condividere baseclass comuni, dove posso scrivere che la definizione funzione identica solo una volta. Tuttavia, a causa del limite di una sola baseclass, non riesco a trovare un posto lungo la gerarchia in cui si inserisce. - Si potrebbe anche provare a implementare una sorta di composite pattern. Mettendo la funzione
DoMagic
in una classe helper separata, ma la funzione qui ha bisogno (e modifica) di un sacco di variabili/campi interni. L'invio di tutti come parametri (di riferimento) sarebbe solo un aspetto negativo. - Il mio istinto mi dice che il adapter pattern potrebbe avere un posto qui, un po 'di classe per convertire tra i due quando necessario. Ma si sente anche hacky.
L'ho taggato con un linguaggio indipendente dal momento che si applica a tutte le lingue che utilizzano questo approccio one-baseclass-many-interfaces.
Inoltre, si prega di indicare se mi sembra di aver frainteso uno dei modelli che ho chiamato.
In C++ vorrei solo creare una classe con i campi privati, l'implementazione della funzione e inserirla nell'elenco di ereditarietà. Qual'è l'approccio corretto in C#/Java e simili?
Questo è esattamente ciò che farei per istinto. Purtroppo, 'CustomButtonUserControl' e' CustomTextUserControl' sono diversi per fare questo lavoro, quindi la mia domanda. O mi sto perdendo qualcosa qui? È difficile giudicare la tua risposta quando pubblichi solo il codice. – Mizipzor
OP ha detto specificamente: non posso sostituire la classe base. –