4

どうすれば実装できますか? 複数のアセンブリで機能しますか? そうでない場合、どうすれば機能しますか?

4

1 に答える 1

14

質問を完全に理解していない可能性があるため、別の可能な説明を提供したいと思います。

クラスについて言えば、Java にはEventListenerがあり、.NET にはEventHandlerがあります。どちらもイベント処理という同じ目的を持っています。ただし、実装には違いがあります。.NET のイベント処理は、Java のイベント リスナーに対するより高いレベルの抽象化であると言えます。

Java の EventListener は、「すべてのイベント リスナー インターフェイスが拡張する必要があるタグ付けインターフェイス」です (つまり、MouseListener)。.NET の EventHandler はデリゲートであり、イベントを処理するメソッドへの厳密に型指定されたポインターです。

より広義には、イベント リスナーはイベント処理用のインターフェイスを実装するオブジェクトであり、イベント ハンドラーはイベントを処理する単なるメソッドです。一般的に言えば、イベント リスナーはオブザーバー デザイン パターンを実装し、イベント ハンドラーはそのパターンのすべての配管を非表示にします。したがって、イベント リスナーの作成は、イベント ハンドラの作成よりもはるかに複雑で、口頭で行う傾向があります。

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 インターフェイスを実装するなど、この一般的なオブザーバー パターンを実装する方法は多数あります。

于 2012-07-13T22:36:47.547 に答える