与EventHandler相比,EventListener是什么?

时间:2012-07-13 14:39:35

标签: c# event-listener

我该如何实施?它会跨多个组件工作吗?如果没有,我该如何使其发挥作用?

1 个答案:

答案 0 :(得分:14)

冒着不完全理解问题的风险,我想提供另一种可能的解释。

谈到类,Java有EventListener,.NET有EventHandler。两者都有相同的目的:事件处理。但是在实施方面存在差异。可以说.NET的事件处理是Java事件监听器的更高级别的抽象。

Java的EventListener是“所有事件监听器接口必须扩展的标记接口”(即MouseListener)。 .NET的EventHandler是一个委托,一个指向处理事件的方法的强类型指针。

更广泛地说,事件侦听器是一个实现事件处理接口的对象,而事件处理程序只是一个处理事件的方法。一般来说,事件侦听器实现Observer Design Pattern并且事件处理程序隐藏该模式的所有管道。因此,撰写event listener更为复杂,而且往往比撰写event handler更加口头。

我建议您阅读Microsoft的Observer Design Pattern以更好地了解它。

因此,要实现事件处理程序,只需将委托分配给要处理的对象的事件即可。即。

Button.Click += new EventHandler(MyButton_Click); 

其中MyButton_Click是一个方法(它可能在你的类或其他地方),它具有EventHandler的签名并实际处理事件,即

private void MyButton_Click(object sender, EventArgs e)
{
    doSomething();
}

为了用Java中的事件监听器实现相同的目的,你会写这样的东西(原谅我,如果我犯了错误,因为我是从内存中写的):

public class MyClass
{
    Button myButton;

    MyClass()
    {
        ...
        myButton.addMouseListener(new ButtonHandler());
    }

    public class ButtonHandler implements MouseListener
    {
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}

        public void mouseClicked(MouseEvent e)
        {
           doSomething("Mouse clicked", e);
        }
    }
}

当然,有很多方法可以实现这种常见的观察者模式,包括在类本身,内部类,匿名类,适配器等中实现EventListener接口。但这应该证明了这一点。