使用事件处理程序与重写事件触发方法

时间:2009-03-18 10:21:00

标签: c# .net winforms

我正在创建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 个答案:

答案 0 :(得分:27)

如果您真的专注于按钮,则覆盖OnClick是有意义的。如果您只是实际更改单击按钮时发生的情况,我首先不会将Button子类化 - 我只是添加事件处理程序。

编辑:只是为了给出更多想法 - 如果你想为多个按钮添加类似的事件处理程序,那么编写实用程序方法就可以轻松实现,并从多个地方调用它。它不需要实际的子类化。这并不是说子类 在你的情况下肯定是错的,当然 - 只是给你额外的选择:)

答案 1 :(得分:7)

继承时始终覆盖OnClick。它可以为您提供更好的性能。

答案 2 :(得分:0)

实际上,附加事件处理程序而不是覆盖方法有一个优点。您的事件处理程序是私有,而被覆盖的方法必须是受保护的,并带有预定义的名称。如果您使用混淆/加密工具来保护您的应用程序,则代码在protected override时比在private时更容易曝光。

答案 3 :(得分:-2)

对于按钮单击,我会将其作为一种阅读方法。但我想这是个人喜好的事情。我有兴趣看看这个共识是什么。