Стандартный шаблон для реализации событий заключается в использовании виртуального метода «OnXxx», например:
public event EventHandler OkClick;
protected virtual void OnOkClick(EventArgs e)
{
if (OkClick != null) OkClick(this, e);
}
Теперь каждый раз, когда ваш базовый элемент управления хочет вызвать событие OkClick, он просто вызывает:
OnOkClick(EventArgs.Empty);
Это означает, что потомки вашего базового элемента управления могут переопределить OnOkClick следующим образом:
protected override void OnOkClick(EventArgs e)
{
// do some stuff before the event is fired
base.OnOkClick(e);
// do some stuff after the event is fired
}
Обратите внимание, что в руководствах по разработке структуры фактически говорится, что вы должны реализовать метод "OnXxx" таким образом, чтобы событие вызывалось, даже если классы-потомки забывают вызвать базовый метод. Я действительно не знаю хорошего способа сделать это, и я уверен, что большинство людей игнорируют это руководство.