イベントと依頼の詳細


依頼
依頼は実質的にクラスであり,メソッド/関数のカプセル化であり,メソッドを参照するタイプであり,メソッドの特定の特徴に名前を指定することができる.依頼の内部には3つの重要なメンバーがいます.目標、方法、前の依頼です.依頼にメソッドが割り当てられると、依頼はそのメソッドと全く同じ動作をします.委任オブジェクトはキーワードdelegateを使用して宣言されます.
通常のコードでは、このようにメソッドを呼び出します.
aBird.Fly();

依頼にカプセル化し、aBirdがターゲット、Flyがメソッドです.依頼はチェーンを構成することができ、「前の依頼」はこのチェーン構造をサポートするために使用されます.
 MethodInvoker mi = new MethodInvoker(aBird.Fly); mi();

この部分と上のaBird.Flyは効果ですが、直接呼び出すわけではありません.miを他の場所に渡して呼び出します.依頼はメソッドと呼び出し元の間に間接性を確立した.イベントは依頼に基づく通信メカニズムである.オブジェクトの状態が変更された場合、この変更を外部に通知したい場合があります.
実装の観点から見ると、「通知」は受信者を呼び出す方法である.苦境は、誰がこれらの変更に興味を持っているのか、どれだけの人がこれらの変更に興味を持っているのか分からないので、私たちは直接方法を呼び出すことができません.
.Netにはこの問題、インタフェース、依頼を解決する2つの方法があります.
この二つの意味はすべて「約束」で、目的は「分離」で、言い換えれば、相談して、別々に行動することです.インタフェースはクラスメンバーに対する約束であり,委任はパラメータと戻り値に対する約束である.簡単な通知では、インタフェースが面倒で、依頼がより良いので、呼び出すべきメソッドを保存するようにクラスに依頼します.しかし、裸のフィールドは少し見苦しくて、服を着ていないようです.コードをもっときれいにするために、Netはイベントの概念を導入した.
≪イベント|Events|ldap≫
イベントは、他のクラスやオブジェクトが注目していることが発生した場合に、クラスまたはオブジェクトがイベントを通じて通知する特殊な形式です(イベントオブジェクトがこの通知プロセスを処理します).
イベントは本質的にadd,removeを提供し,この依頼にメソッドを掛けたり,この依頼から削除したりする方法である.このように:
//    
button1.Click += new EventHandler(button1_Click);
//    
button1.Click -= new EventHandler(button1_Click);

AがBのイベントを購読した場合、それらの間の参照関係は、Bが依頼を参照し、Aを依頼する.
すなわち、Aは、Bにその参照が含まれているため、レビューイベントを返す前にゴミとして回収されない.
したがって,委任とイベントの違いは,委任とクラス,構造,インタフェース,列挙がクラスであり,イベントはクラスメンバー,属性,メソッド,フィールドがクラスである.
総合インスタンス応用
Class Cat{

    private String name;

    public Cat(String name){
        this.name = name;
    }

    //      CatShoutEventHandler   
    public delegate void CatShoutEventHandler();

    //    CatShout,         CatShoutEventHandler
    public event CatShoutEventHandler CatShout CatShout;

    public void shout(){
        System.out.println("I am cat " + name + ".");

        //   Shout()   ,  CatShout        ,   CatShout
        if(CatShout != null){
            CatShout();
        }
    }

}

このクラスのCatShout()は、イベントCatShoutのタイプがCatShoutEventHandlerに委任され、CatShoutEventHandlerはパラメータなし、戻り値なしであるため、パラメータなしの方法である.
Class Mouse{

    private String name;

    public Mouse(String name){
        this.name = name;
    }

    public void run(){
        System.out.println("Cat is comming ," + name + " run!");
    }

}
//    
public static void main(String[] args){

    Cat cat = new Cat("Tom");
    Mouse JerryMouse = new Mouse("Jerry");
    Mouse JackMouse = new Mouse("Jack");

    // Mouse run()         Cat.CatShoutEventHandler   Cat  CatShout  
    cat.CatShout += new CatShoutEventHandler(JerryMouse.run);
    cat.CatShout += new CatShoutEventHandler(JackMouse.run);

    cat.shout();

}

実行結果:
I am cat tom.
Cat is coming,JerryMouse run!
Cat is coming,JackMouse run!

いくつかの説明:
1、
new CatShoutEventHandler(JerryMouse.run)

の意味は依頼をインスタンス化することであり、依頼の例はMouseのrun()メソッドである.
2、
cat.CatShout +=

表示
cat.add_CatShout(new CatShoutEventHandler(JerryMouse.run));

「+=」は、委任インスタンスオブジェクトを追加することを意味します.「-=」依頼インスタンスオブジェクトを削除するという意味add_CatShout();これを使用すると、イベントをトリガーする必要があるときに通過するオブジェクトを減らすことになります.