Я бы рассмотрел вариант 4: композиция.
Сначала определите ваш набор функций.Мы предполагаем, что ваш частичный список является эксклюзивным, поэтому «Чтение» и «Предупреждение».
Во-вторых, создайте отдельный класс, реализующий эту функцию, что-то вроде MyCommonControlBehaviors
.Я бы предпочел, чтобы эта реализация не была статичной, если это возможно, хотя она может быть общей.
public MyCommonControlBehaviors
{
public Whatever Read() { /* ... */ }
public void Alert() {}
}
В-третьих, используйте композицию, чтобы добавить экземпляр этого класса к каждому из ваших пользовательских типов элементов управления и предоставить эту функциональность.с помощью пользовательского элемента управления:
public class MyCustomControl
{
private MyCommonControlBehaviors common; // Composition
public Whatever Read() { return this.common.Read(); }
public void Alert() { this.common.Alert(); }
}
В зависимости от специфики вы можете проявить творческий подход до необходимой степени.Например, возможно, ваши пользовательские поведения должны взаимодействовать с частными данными управления.В этом случае заставьте свой элемент управления реализовывать общий ICommonBehaviorHost
интерфейс, необходимый для вашего общего поведения.Затем передайте элемент управления в класс поведения при создании как экземпляр 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 */ }
}