Использование обработчиков событий против переопределения методов запуска событий - PullRequest
23 голосов
/ 18 марта 2009

Я создаю подкласс Button и хотел бы добавить настраиваемую функциональность к некоторым ее событиям, таким как OnClick. Какой способ сделать это более желателен? Должен ли я переопределить OnClick:

protected override void OnClick(EventArgs e)
{
    base.OnClick(e);
    doStuff();
}

или я должен вместо этого связать событие OnClick с обработчиком событий, определенным в моем подклассе Button, через конструктор?

class ButtonSubclass
{
    public ButtonSubclass() : base()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        this.Click += new System.EventHandler(this.ButtonSubclass_Click);
    }
}

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

Ответы [ 4 ]

27 голосов
/ 18 марта 2009

Если вы действительно специализируете кнопку, имеет смысл переопределить OnClick. Если вы только на самом деле меняете то, что происходит при нажатии кнопки, я бы не стал подклассом Button, во-первых, я бы просто добавил обработчики событий. *

РЕДАКТИРОВАТЬ: просто чтобы дать немного больше идеи - если вы хотите добавить аналогичные обработчики событий для нескольких кнопок, достаточно легко написать для этого вспомогательный метод и вызывать его из нескольких мест. Это не требует фактического подкласса. Нельзя сказать, что подкласс является определенно неправильным в вашем случае, конечно - просто давая вам дополнительные опции:)

7 голосов
/ 18 марта 2009

Всегда переопределять OnClick при наследовании. Это дает вам лучшую производительность.

0 голосов
/ 14 января 2018

На самом деле, есть одно преимущество присоединения обработчика событий по сравнению с переопределением метода. Ваш обработчик событий private , в то время как ваш переопределенный метод должен быть protected с предопределенным именем. Если вы используете средства запутывания / шифрования для защиты своего приложения, ваш код более уязвим, когда он protected override, чем когда private.

0 голосов
/ 18 марта 2009

Для нажатия кнопки, я бы оставил его как метод для чтения. Но я думаю, это вещь личных предпочтений. Мне было бы интересно посмотреть, что такое консенсус.

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