2009-03-18 5 views
22

Я создаю подкласс 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); 
    } 
} 

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

ответ

26

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

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

+1

Не могли бы вы определить «специализацию» в этом контексте? – MasterMastic

+0

@Ken: заставить его вести себя по-настоящему * разным * способом, например. выполнение всех обработчиков в обратном порядке. Не только «кнопка, которая всегда имеет определенный обработчик». –

+0

Имеет смысл, спасибо, Джон! :) – MasterMastic

8

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

+4

Производительность должна считаться вторичной важностью для удобочитаемости в большинстве случаев, пока влияние не окажется значительным. Я не считаю, что разница в производительности здесь значительна (она довольно мала, и мы говорим * нажатие кнопок * здесь, то есть относительно редкие события). –

+0

Я не говорю, что переопределение OnClick ошибочно - просто эта производительность не является причиной для этого. –

+0

Производительность для 1 дополнительного обработчика событий немного смехотворна – RvdK

-2

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

0

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

Смежные вопросы