I would consider option 4: composition.
Define your feature set first. We will assume that your partial list is exclusive, therefore "Read" and "Warning."
Secondly, create one class that implements this functionality, for example MyCommonControlBehaviors. I would prefer that this implementation is not static, if possible, although it may be general.
public MyCommonControlBehaviors
{
public Whatever Read() { }
public void Alert() {}
}
-, , :
public class MyCustomControl
{
private MyCommonControlBehaviors common;
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(); }
}
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() { }
}