Viniendo de un fondo de C++, estoy acostumbrado a la herencia múltiple. Me gusta la sensación de una escopeta dirigida directamente a mi pie. Hoy en día, trabajo más en C# y en Java, donde solo se puede heredar una clase base pero se implementa cualquier cantidad de interfaces (¿obtuve la terminología correcta?).Patrón de diseño para usar en lugar de herencia múltiple
Por ejemplo, vamos a considerar dos clases que implementan una interfaz común, pero diferentes baseclasses (todavía es necesario):
public class TypeA : CustomButtonUserControl, IMagician
{
public void DoMagic()
{
// ...
}
}
public class TypeB : CustomTextUserControl, IMagician
{
public void DoMagic()
{
// ...
}
}
ambas clases son UserControl
s así que no puedo sustituyo la clase base. Ambos necesitan implementar la función DoMagic
. Mi problema ahora es que ambas implementaciones de la función son idénticas. Y odio el código de copiar y pegar.
Las soluciones (posibles):
- yo, naturalmente, quieren
TypeA
yTypeB
para compartir una clase base común, en el que puedo escribir esa definición idéntica función sólo una vez. Sin embargo, debido a tener el límite de una sola clase base, no puedo encontrar un lugar a lo largo de la jerarquía en donde se ajuste. - También se podría intentar implementar un tipo de composite pattern. Poniendo la función
DoMagic
en una clase auxiliar separada, pero la función aquí necesita (y modifica) una gran cantidad de variables/campos internos. Enviarlos a todos como parámetros (de referencia) simplemente se vería mal. - Mi instinto me dice que el adapter pattern podría tener un lugar aquí, alguna clase para convertir entre los dos cuando sea necesario. Pero también se siente hacky.
Lo etiqueté con un lenguaje independiente, ya que se aplica a todos los lenguajes que utilizan este enfoque de una base de clase y muchas interfaces.
Además, señale si parece que no entendí ninguno de los patrones que mencioné.
En C++ simplemente crearía una clase con los campos privados, esa implementación de funciones y la pondré en la lista de herencia. ¿Cuál es el enfoque adecuado en C#/Java y similares?
Esto es precisamente lo que haría por instinto. Lamentablemente, 'CustomButtonUserControl' y' CustomTextUserControl' son diferentes para que esto funcione, de ahí mi pregunta. ¿O me estoy perdiendo algo aquí? Es difícil juzgar tu respuesta cuando solo publicas el código. – Mizipzor
OP dijo específicamente: No puedo sustituir la clase base. –