Consideraría la opción 4: composición.
Primero, defina su conjunto de funciones. Asumiremos que su lista parcial es exclusiva, por lo tanto, "Leer" y "Alertar".
En segundo lugar, cree una única clase que implemente esta funcionalidad, algo así como MyCommonControlBehaviors
. Preferiría que esta implementación no sea estática si es posible, aunque puede ser genérica.
public MyCommonControlBehaviors
{
public Whatever Read() { /* ... */ }
public void Alert() {}
}
En tercer lugar, composición de uso para añadir una instancia de esta clase para cada uno de los tipos de controles personalizados y exponer esa funcionalidad a través de su control personalizado:
public class MyCustomControl
{
private MyCommonControlBehaviors common; // Composition
public Whatever Read() { return this.common.Read(); }
public void Alert() { this.common.Alert(); }
}
Dependiendo de los detalles, puede ser creativo a el grado necesario Por ejemplo, quizás sus comportamientos personalizados necesiten interactuar con datos de control privados. En ese caso, haga que su control implemente una interfaz ICommonBehaviorHost
común que sus comportamientos comunes necesitan.A continuación, pasar el control en la clase del comportamiento en la construcción como una instancia de ICommonBehaviorHost
:
public interface ICommonBehaviorHost
{
void Notify();
}
public class MyCommonControlBehaviors
{
ICommonBehaviorHost hst = null;
public MyCommonControlBehaviors(ICommonBehaviorHost host)
{
this.hst = host;
}
public void Alert() { this.hst.Notify(); } // Calls back into the hosting control
// ...
}
public class MyCustomControl : ICommonBehaviorHost
{
private MyCommonControlBehaviors common = null;
public MyCustomControl() { common = new MyCommonControlBehaviors(this); }
public Whatever Read() { return this.common.Read(); }
public void Alert() { this.common.Alert(); }
void ICommonBehaviorHost.Notify() { /* called by this.common */ }
}
y acóplelo con inyección de dependencia para minimizar el acoplamiento de su sistema ... –
+1 @marc_s para la verdad. Hay muchas técnicas adicionales que se pueden usar para minimizar el acoplamiento y agregar capacidad a este enfoque. Una cosa que he hecho en el pasado es hacer 'MyCommonControlBehaviors' genérico para que pueda devolver un' MyCustomControl', sea lo que sea. (En este ejemplo, no tiene mucho sentido, pero en el dominio con el que estaba trabajando tenía mucho sentido). –