Обратите внимание, что объявление события, которое вы используете, является сокращенной записью в C #:
public event EventHandler Event;
public void RaiseEvent() {
this.Event(this, new EventArgs());
}
Эквивалентно:
private EventHandler backEndStorage;
public event EventHandler Event {
add { this.backEndStorage += value; }
remove { this.backEndStorage -= value; }
}
public void RaiseEvent() {
this.backEndStorage(this, new EventArgs());
}
Где backEndStorage - многоадресный делегат.
Теперь вы можете переписать свой код:
public interface IFoo
{
event EventHandler<FooEventArgs> FooValueChanged;
void RaiseFooValueChanged(IFooView sender, FooEventArgs e);
}
[TypeDescriptionProvider(typeof(FooBaseImplementor))]
public abstract class FooBase : Control, IFoo
{
protected event EventHandler<FooEventArgs> backEndStorage;
public event EventHandler<FooEventArgs> FooValueChanged {
add { this.backEndStorage += value; }
remove { this.backEndStorage -= value; }
}
public void RaiseFooValueChanged(IFooView sender, FooEventArgs e)
{
this.backEndStorage(sender, e);
}
}
public class FooDerived : FooBase {
public event EventHandler<FooEventArgs> AnotherFooValueChanged {
add { this.backEndStorage += value; }
remove { this.backEndStorage -= value; }
}
}
Так что теперь, когда события добавляются в производный класс, они фактически добавляются в backEndStorage базового класса, что позволяет базовому классу вызывать делегаты, зарегистрированные в производном классе.