Заставили задуматься слова Трея Нэша:
Существует популярная идиома при генерации события - инициировать его внутри метода protected virtual по имени On<event>... Таким образом, производные классы могут легко модифицировать действия, предпринимаемые, когда должно быть инициировано событие...
Т.е. в виртуальном методе
protected virtual OnClick он предлогает вызывать событие при клике мыши, допустим. Но ведь в MFC и в Delphi подобным образом обзывали методы, обрабатывающие события. Ну и я так в дальнейшем поступал: был базовый класс, который инициировал событие там, где нужно, а в
protected virtual OnClick была его обработка у дочерних классов.
Так, у меня есть базовый класс Document с методом
protected abstract void OnLayerVisiblyChanged(object sender, MapSurrounds.ItemArgs e);. Где-то (допустим, в конструкторе) Document подписывается на событие
LayerVisiblyChangedEvent, и когда оно происходит - вызывает метод
void OnLayerVisiblyChanged(object sender, MapSurrounds.ItemArgs e). А уже дочерние классы сами решают, что должно происходить в этот момент.
Так вот, решил разобраться. Читаю
http://www.rsdn.ru/article/mag/200401/codestyle.XML. Там в разделе "события" пишут то же самое, что и у Трея Нэша:
public delegate void MouseEventHandler(object sender, MouseEventArgs e);
public class MouseEventArgs : EventArgs
{
private int x;
private int y;
public MouseEventArgs(int x, int y)
{
this.x = x;
this.y = y;
}
public int X { get { return x; } }
public int Y { get { return y; } }
}
public class Control
{
public event MouseEventHandler MouseMove;
protected virtual void OnMouseMove(MouseEventArgs e)
{//Вызов! А я тут всегда обработку пишу
if (MouseMove != null)
MouseMove(this, e);
}
}
Не могу понять, как так получилось и как все таки правильно? Почему в
On<event> в MFC и в Delphi идет обработка события, а тут предлогают вызывать его.