zoukankan      html  css  js  c++  java
  • 面向对象——(10)委托与事件

           委托是对函数的封装,可以当做给方法的特征制定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。

           委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托对象用关键字delegate来声明。而事件是说在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。事件对象用event关键字声明。


    public delegate void CatShoutEventHandler();

    public event CatShoutEventHandler CatShout;



          委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication30
    {
     
        class Program
        {
            public delegate void CatShoutEventHandler();
            public event CatShoutEventHandler CatShout;
            static void Main(string[] args)
            {
                Cat cat=new Cat ("Tom");      //实例化Tom猫和老鼠Jerry、Jack
                Mouse mouse1=new Mouse ("Jerry");   
                Mouse mouse2=new Mouse ("Jack");
    
                cat.CatShout +=new Cat.CatShoutEventHandler(mouse1.Run );  //表示将Mouse的Run方法通过实例化委托Cat.CatShoutEventHandler登记到Cat的事件CatShout当中。其中“+=”表示“add_CatShout"的意思
                cat.CatShout +=new Cat.CatShoutEventHandler(mouse2.Run );
                cat.Shout ();
                Console.Read ();
            }
        }
    
        class Cat 
        {
        
            private string name;
            public Cat(string name)
            {
                this.name=name;
            }
    
            public delegate void CatShoutEventHandler();    //声明委托CatShoutEventHandler
    
            public event  CatShoutEventHandler CatShout;  //声明事件CatShout,它的事件类型是委托CatShoutEventHandler
    
            public void Shout()
            {
                Console.WriteLine ("喵,我是{0}.",name);
                
                if (CatShout !=null)
                {
                    CatShout ();   //表明执行Shout()方法时,如果CatShout中有对象登记事件则执行CatShout()
                }
            }
        }
    
        class Mouse
        {
            private string name;
            public Mouse (string name)
            {
                this.name=name;
            }
    
            public void Run()     //逃跑的方法
            {
                Console.WriteLine ("老猫来了,{0}快跑!",name );
            }
        }
    }
    

    运行结果为:



    委托在开发中的作用:

    启动线程

    通用类库

    事件


    委托可以看成是一种数据类型,可以用于定义量,但它是一种特殊的数据类型,它所定义的变量能接收的数值只能是一个函数,更确切的说,委托类型的变量可以接收的数值只能是一个函数,委托的变量可以接收一个函数的地址,类似C++语言的函数指针。



    委托变量可看成是一种类型安全的函数指针,它只接收符合其要求的函数引用。



  • 相关阅读:
    玩转oracle学习第五天
    硅谷科技巨头最刁钻面试题集锦
    Python模拟登录wap版百度贴吧+自己主动回贴
    Flask 源代码阅读笔记
    Spark1.0.0 生态圈一览
    listView.getChildAt(i)时java.lang.NullPointerException
    选择排序
    JNI 系统钩子
    MySQL Cluster2个数据节点压力测试--mysqlslap工具压400W写
    VVDocumenter
  • 原文地址:https://www.cnblogs.com/saixing/p/6730350.html
Copyright © 2011-2022 走看看