Вызов базовых методов при переопределении событий уровня страницы

В своем коде я связываю свои события так:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    btnUpdateUser.Click += btnUpateUserClick;
}

Я сделал это так, потому что это то, что я видел в примерах.

  • Нужно ли вызывать метод base.OnInit ()?
  • Будет ли это неявно называться?
  • Это лучше назвать в начале метода или в конце?
  • Каков пример, когда путаница с базовым методом может привести к неприятностям?
21.08.2008 03:33:25
6 ОТВЕТОВ
РЕШЕНИЕ

Я должен уточнить:

В рекомендациях рекомендуется, чтобы при запуске события использовался виртуальный метод «On EventName », но также говорится, что если производный класс переопределяет этот метод и забывает вызывать базовый метод, событие все равно должно запускаться.

Смотрите "Важное примечание" на полпути вниз по этой странице :

Производные классы, которые переопределяют защищенный виртуальный метод, не обязаны вызывать реализацию базового класса. Базовый класс должен продолжать работать правильно, даже если его реализация не вызывается.

3
21.08.2008 03:46:51

В этом случае, если вы не вызываете базовый OnInit, то Init даже не сработает.

В общем случае, ВСЕГДА рекомендуется вызывать базовый метод, если только вы не знаете, что не хотите, чтобы базовое поведение происходило.

Будет ли он вызываться в начале или в конце, зависит от того, как вы хотите, чтобы все работало. В таком случае, когда вы используете переопределение вместо подключения обработчика событий, вызов его в начале метода имеет больше смысла. Таким образом, ваш код будет выполняться после любых обработчиков, что делает его более эмулирующим «нормальный» обработчик событий.

0
21.08.2008 03:38:41

Хотя официальные руководящие принципы проектирования фреймворка рекомендуют иное, большинство дизайнеров классов фактически делают метод OnXxx () ответственным за запуск фактического события, например так:

protected virtual void OnClick(EventArgs e)
{
    if (Click != null) Click(this, e);
}

... так что если вы наследуете от класса и не вызываете base.OnClick (e), событие Click никогда не сработает.

Так что да, даже если этого не должно быть в соответствии с официальными рекомендациями по дизайну, я думаю, что стоит назвать base.OnInit (e) просто чтобы быть уверенным.

0
21.08.2008 03:41:20

официальные руководящие принципы проектирования рамок рекомендуют иначе

Они делают? Мне любопытно, я всегда думал об обратном, и чтение Руководства по проектированию фреймворка и запуск FxCop только укрепили мое мнение. У меня сложилось впечатление, что события всегда должны запускаться из виртуальных методов OnXxx (), которые принимают параметр EventArgs.

0
21.08.2008 03:43:57

Возможно, вам лучше так поступить, тогда эта дискуссия уйдет. Однако статья интересна, особенно если учесть, что .NET Framework не соблюдает это правило.

0
21.08.2008 03:57:19

@ Ch00k и @ Scott Я не знаю - мне самому нравится шаблон On EventName . И да, я один из тех, кто виновен в том, что запустил событие из этого метода.

Я думаю, что нужно переопределить метод On * и вызвать базовый. Обработка ваших собственных событий кажется неправильной.

0
21.08.2008 04:09:00