Je considérerais l'option 4: composition.
D'abord, définissez votre ensemble de fonctionnalités. Nous supposerons que votre liste partielle est exclusive, donc "Lire" et "Alerte". Ensuite, créez une classe unique qui implémente cette fonctionnalité, quelque chose comme MyCommonControlBehaviors
. Je préférerais que cette implémentation ne soit pas statique si possible, cependant, elle peut être générique.
public MyCommonControlBehaviors
{
public Whatever Read() { /* ... */ }
public void Alert() {}
}
En troisième lieu, la composition d'utilisation pour ajouter une instance de cette classe à chacun de vos types de contrôle personnalisés et d'exposer cette fonctionnalité grâce à votre contrôle personnalisé:
public class MyCustomControl
{
private MyCommonControlBehaviors common; // Composition
public Whatever Read() { return this.common.Read(); }
public void Alert() { this.common.Alert(); }
}
Selon les détails, vous pouvez faire preuve de créativité pour le degré nécessaire. Par exemple, peut-être que vos comportements personnalisés doivent interagir avec des données de contrôle privées. Dans ce cas, faites en sorte que votre contrôle implémente une interface commune à laquelle vos comportements habituels ont besoin.Passez ensuite le contrôle dans la classe de comportement sur la construction comme une instance 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 */ }
}
et le coupler avec injection de dépendances pour minimiser le couplage de votre système ... –
+1 @marc_s for truth. Il y a beaucoup de techniques supplémentaires qui peuvent être utilisées pour minimiser le couplage et ajouter de la capacité à cette approche. Une chose que j'ai faite dans le passé est de rendre MyCommonControlBehaviors générique afin qu'il puisse renvoyer un MyCustomControl, quel qu'il soit. (Dans cet exemple, cela n'a pas beaucoup de sens, mais dans le domaine avec lequel je travaillais, cela avait beaucoup de sens.) –