Добавить обработчик события в конструктор производного класса или переопределить метод OnX ()? - PullRequest
5 голосов
/ 25 июня 2010

При проектировании производного класса есть [преимущества] преимущества добавления обработчика к событию базового класса в ctor по сравнению с переопределением метода OnEventName() и добавления некоторого поведения (а также вызова базового метода),если вам не нужно менять базовый метод и его не волнует, в каком порядке все происходит, а нужен только повторно используемый компонент с небольшим дополнительным поведением?

базовый класс:

public abstract class BaseClass
{
    public event EventHandler SomeEvent;
    protected void OnSomeEvent(object sender, EventArgs e)
    {
        // do some stuff
    }
}

вариант A:

public class DerivedA
{
    protected override void OnSomeEvent(object sender, EventArgs e)
    {
        // do some other stuff
        base.OnSomeEvent(sender, e);
    }
}

вариант B:

public class DerivedB
{
    public DerivedB()
    {
        SomeEvent += (o,e) => { // do some other stuff };
    }
}

Ответы [ 2 ]

3 голосов
/ 25 июня 2010

Нет никаких существенных преимуществ / недостатков ни у одного из подходов.

Есть несколько различий между подпиской на событие и переопределением метода базового класса. Например, если вы хотите, чтобы какой-то код выполнялся до или после всех других обработчиков, вам действительно следует переопределить метод OnSomeEvent, поскольку в противном случае нет способа гарантировать это. Но вы указываете, что вас это не волнует.

В общем, переопределение метода - это то, что требует хорошего понимания поведения базового класса, чтобы гарантировать, что вы случайно не нарушите ничего. Подписка на событие является менее навязчивым расширением и является тем, что (предположительно) разработчик базового класса запланировал.

Иногда люди утверждают, что производительность лучше при переопределении, но я не покупаю этот аргумент. Производительность имеет значение только тогда, когда она имеет значение . Разница здесь, вероятно, настолько незначительна, что нужно больше заботиться о простоте, правильности и простоте обслуживания, а не о производительности.

2 голосов
/ 25 июня 2010

Вы уже упомянули порядок, в котором вещи называются. Некоторые другие вещи, которые по общему признанию не случаются все так часто, но могут быть существенными (основанными на факте, что базовый класс управляет, как вызваны обработчики событий):

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...