Rozważałbym opcję 4: skład.
Najpierw określ swój zestaw funkcji. Zakładamy, że twoja lista częściowa jest wyłączna, więc "Odczyt" i "Alert".
Po drugie, utwórz pojedynczą klasę, która implementuje tę funkcję, podobnie jak MyCommonControlBehaviors
. Wolałbym, aby ta implementacja nie była statyczna, jeśli to możliwe, ale może być ogólna.
public MyCommonControlBehaviors
{
public Whatever Read() { /* ... */ }
public void Alert() {}
}
trzecie, kompozycja użycie dodać instancję tej klasy do każdego z rodzajów kontroli celnych i odsłonić tę funkcjonalność poprzez kontrolą niestandardowe:
public class MyCustomControl
{
private MyCommonControlBehaviors common; // Composition
public Whatever Read() { return this.common.Read(); }
public void Alert() { this.common.Alert(); }
}
zależności od specyfiki można ruszyć do stopień konieczny. Np. Być może Twoje niestandardowe zachowania wymagają interakcji z prywatnymi danymi kontrolnymi. W takim przypadku spraw, aby sterowanie wdrożyło wspólny interfejs ICommonBehaviorHost
wymagany przez typowe zachowania.Następnie przekazać kontrolę do klasy zachowanie na budowie jako przykład 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 */ }
}
i połącz go z wtryskiem zależności, aby zminimalizować sprzężenie systemu ... –
+1 @ marc_s dla prawdy. Istnieje wiele dodatkowych technik, które można wykorzystać w celu zminimalizowania sprzężeń i dodania możliwości tego podejścia. Jedną z rzeczy, które robiłem w przeszłości, jest generowanie 'MyCommonControlBehaviors', aby mogło zwrócić' MyCustomControl', cokolwiek to jest. (W tym przykładzie nie ma to większego sensu, ale w domenie, z którą pracowałem, miało to sens). –