Заставили задуматься слова Трея Нэша:
Существует популярная идиома при генерации события - инициировать его внутри метода 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 идет обработка события, а тут предлогают вызывать его.