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

    最近在研究委托,在此跟大家分享下。

    委托时什么

        官方的讲:委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看做是对函数的抽象,是函数的"类",委托的实例将代表一个具体的函数。

        另一种教容易理解的解释:委托是一个类,它定义了方法的类型,使方法可以当作另一个方法的参数来进行传递。

    看完定义可能是一脸懵逼,下面我们在以实例来说明:

          我在网上购买的东西到菜鸟驿站了,但是我今天要加班,无法自己去取,所有我就打电话让妹妹去帮我拿下快递,下面我们代码实现,第一版无委托

        public class Courier
        {
            private Sister sister;
            public Courier(Sister sister)
            {
                this.sister = sister;
            }
            public void Nofice()
            {
                Tike();
                sister.Take();
            }
            public void Tike()
            {
                Console.WriteLine("你的快递到了");
                Console.WriteLine("----------------");
            }
    
    
        }
        public class Sister
        {
    
            public void Take()
            {
                Console.WriteLine("帮我取下快递哦,妹妹");
                Console.WriteLine("好的,马上取");
            }
        }
    
     /// <summary>
        /// 客户端
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                Courier courier = new Courier(new Sister());
                courier.Nofice();
            }
        }
    //结果
    你的快递到了
    ----------------
    帮我取下快递哦,妹妹
    好的,马上取
    View Code

    第二部,引入委托

      public delegate void TakeEventHandler(); //声明委托
        public class Courier
        {
            public event TakeEventHandler take;//定义事件,相当于委托的变量
            public void Nofice()
            {
                Tike();
                take();
            }
            public void Tike()
            {
                Console.WriteLine("你的快递到了");
                Console.WriteLine("----------------");
            }
    
    
        }
        public class Sister
        {
            public void Take()
            {
                Console.WriteLine("帮我取下快递哦,妹妹");
                Console.WriteLine("好的,马上取");
            }
        }
    
        /// <summary>
        /// 客户端
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                Courier courier = new Courier();
                courier.take += new TakeEventHandler(new Sister().Take);
                courier.Nofice();
    
            }
        }
    View Code
    View Code

    这就是委托的应用,委托被人帮你完成,生活中有很多这样的例子,

    在程序中引入委托解耦了Courier类与Sister类,使类直接不相互依赖,这样Sister类的改变都不会影响到Courier

    下面我们来分析一下

    1.声明一个为委托

       public delegate void TakeEventHandler();  定义了一个方法的类型,既返回值为void,无参类型的TakeEventHandler

    2.声明一个事件:

            public event TakeEventHandler take;

    3.将被委托的方法注册到事件:

          courier.take += new TakeEventHandler(new Sister().Take);//+=是注册,-=是注销

    4.触发需要委托的方法:

         courier.Nofice();

    5.需要委托的方法中有事件的触发

      public void Nofice()
           {
               Tike();

              take();//
           }

    总结

    面向对象的思想:职责分明。自己不用做的事,就委托给该干这事的人。

        通过委托,实现了Courier和Sister之间的解耦。即Courier要用Sister的方法,但没有直接调用。

        提高了代码的可扩展性,如果此时Courier还有别的事情,如要买菜,就可以把买菜委托给另一个Sister,这时,只需要再添加一个Sister类,里面写上买菜的方法,在主方法中将买菜注册到委托的事件中。就可以实现委托另一个Sister去买菜了。整个过程不会对原有程序进行任何改动。所以使用委托,提高了程序的可扩展性。

  • 相关阅读:
    神州数码RIP协议认证
    神州数码RIP路由协议
    神州数码路由器静态路由配置
    神州数码广域网链路封装
    神州数码路由器以太网端口单臂路由
    神州数码路由器的基本管理方式
    路由器DHCP服务及DHCP中继
    CHAP认证(双向)
    PAP认证(单向、双向)
    基于链路的OSPFMD5口令认证
  • 原文地址:https://www.cnblogs.com/studydp/p/9562601.html
Copyright © 2011-2022 走看看