zoukankan      html  css  js  c++  java
  • C#中的委托与事件

    概念

    委托

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托用于将方法作为


    参数传递给其他方法。在方法重载的上下文中,方法的签名不包括返回值。但在委托的上下文中,签名的确包括返回


    值。换句话说,方法和委托必须具有相同的返回值。


    委托的声明

    	public delegate void EventHandler();		//无参数,无返回值

    事件


    事件则是委托的一种特殊形式,发生有意义的事情时,事件对象处理通知过程。或对象可以通过事件向其他类


    或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。



    事件的声明

    	public event EnentHandler Update ;		//声明一个“EventHandler”的委托事件

    委托和事件的使用

      //通知者接口
        interface Subject
        {
            void Notify();
            string SubjectState
            {
                get;
                set;
            }
        }
        //StockObserve类
        class StockObserver
        {
            //构造函数对StockObserver类进行赋值 
            private string name;
            private Subject sub;
            public StockObserver(string name, Subject sub)
            {
                this.name = name;
                this.sub = sub;
            }
            //方法“通知”
            public void CloseStockMarket()
            {
                Console.WriteLine("{0}{1}关闭股票软件,赶快假装工作!",sub.SubjectState ,name );
            }
        }
    //看NBA直播的同事
        class NBAObserver
        {
              //构造函数对StockObserver类进行赋值 
            private string name;
            private Subject sub;
            public NBAObserver(string name, Subject sub)
            {
                this.name = name;
                this.sub = sub;
            }
            //方法“通知”
            public void ShutDownNBADirect()
            {
                Console.WriteLine("{0}{1}关闭NBA直播,赶快假装工作!",sub.SubjectState ,name );
            }
        }
       
       
        //声明委托
        delegate void EventHandler();
        //boss类
        class Boss : Subject
        {
            //声明一个事件Update,类型为委托EventHandler
            public event EventHandler Update ;
    
            private string action ;     //用于记录前台状态的变量
    
            public void Notify ()
            {
                Update ();                  //在访问方法“Notify”时,调用update 事件
            }
    
            //返回和对前台状态进行读写
            public string SubjectState
            {
                get { return action; }
                set { action = value; }
            }
        }
        //Secretary类
        class Secretary : Subject
        {
            //声明一个事件Update,类型为委托EventHandler
            public event EventHandler Update;
    
            private string action;     //用于记录前台状态的变量
    
            public void Notify()
            {
                Update();                  //在访问方法“Notify”时,调用update 事件
            }
    
            //返回和对前台状态进行读写
            public string SubjectState
            {
                get { return action; }
                set { action = value; }
            }
        }


    客户端代码

    static void Main(string[] args)
            {
                //老板陈
                Boss chen = new Boss();
    
             
                StockObserver  tongshia = new StockObserver("陈易得",chen );
                NBAObserver tongshib = new NBAObserver("陈德清",chen );
    
    
               chen.Update +=new EventHandler(tongshia.CloseStockMarket );
               chen.Update += new EventHandler(tongshib.ShutDownNBADirect );
    
                //老板chen回来了
                chen.SubjectState = "老板chen回来了!!!!";
                //发出通知
                chen.Notify();
    
            }



    通过 委托EventHandler将,将“看股票者(stockobserver)”的closestockmarket方法挂钩到老板的更新上,同时将Shu


    tDownNBADirect的方法挂钩到update上,也就是将两个不同类的不同方法委托给老板类的更新了。


    委托具有以下特点:


    委托类似于 C++ 函数指针,但它们是类型安全的。


    委托允许将方法作为参数进行传递。


    委托可用于定义回调方法。


    委托可以链接在一起;例如,可以对一个事件调用多个方法。


    方法不必与委托签名完全匹配。


  • 相关阅读:
    架构师养成记--19.netty
    架构师养成记--18.NIO
    架构师养成记--17.disrunptor 多生产者多消费者
    JS计算字符长度、字节数 -- 转
    BootStrap Modal 点击空白时自动关闭
    架构师养成记--16.disruptor并发框架中RingBuffer的使用
    架构师养成记--15.Disruptor并发框架
    架构师养成记--14.重入锁ReentrantLock 和 读写锁 ReentrantReadWriteLock
    049、Java中使用switch判断,不加入break时的操作
    048、Java中使用switch判断
  • 原文地址:https://www.cnblogs.com/guziming/p/4232755.html
Copyright © 2011-2022 走看看