• 学习笔记: 委托解析和封装,事件及应用


    1. 委托的本质: 是一个类, 继承自 System.MulticastDelegate 里面内置了几个方法

    Noreturn委托 编译后的IL

     

    1. 多播委托的 举例

            //猫叫一声 触发一系列后续动作
            //多个 指定动作 正式不稳定原因, 封装出去 甩锅

    public class Cat
         {
             public int MyProperty { get; set; }
             public void Miao()
             {
                 Console.WriteLine("{0} miao", this.GetType().Name);

                new Mouse().Run();
                 new Baby().Cry();
                 new Dog().Wang();
             }

            //猫叫一声 触发一系列后续动作
             //多个 指定动作 正式不稳定原因, 封装出去 甩锅

            public void MiaoNew(MiaoDelegate miaoDelegate)
             {
                 Console.WriteLine("{0} MiaoNew", this.GetType().Name);

                if (miaoDelegate != null)
                     miaoDelegate.Invoke();
             }
         }

        public delegate void MiaoDelegate();
         class Mouse
         {
             public void Run()
             {
                 Console.WriteLine("{0} run", this.GetType().Name);
             }
         }

        class Baby
         {
             public void Cry()
             {
                 Console.WriteLine("{0} cry", this.GetType().Name);
             }
         }

        class Dog
         {
             public void Wang()
             {
                 Console.WriteLine("{0} Wang", this.GetType().Name);
             }
         }

    static void Main(string[] args)
    {

        Cat cat = new Cat();
         cat.Miao();

        var miaoDelegate = new MiaoDelegate(new Mouse().Run);
         miaoDelegate += new MiaoDelegate(new Baby().Cry);
         miaoDelegate += new MiaoDelegate(new Baby().Cry);
         miaoDelegate += new MiaoDelegate(new Dog().Wang);

        cat.MiaoNew(miaoDelegate);
    }

    2. 对事件的理解

    事件 : 带有event关键字的委托的实例, event可以限制变量被 外部调用/直接赋值

    ChildClass:Cat 也不可以对cat中的 event进行操作

    image

    image

    从 IL中可以看出  委托实例是public字段, 而事件是 private字段, 自然外部不可调用了

    image

    委托和事件的区别与联系?

    委托的本质 是类, 就是一个类型,比如 Student类

    事件 是委托类型的一个实例 比如 同学A 是student的一个实例

    事件: 可以吧一堆可变的动作/行为 封装出去, 交给外部制定, 预定义一样,

            程序设计时候, 可以把程序分为2部分, 固有部分写死, 不固定部分开放接口,外部可随意扩展

    框架: 完成固定/通用部分, 把可变部分留出扩展点, 支持自定义

  • 相关阅读:
    composer 安装laravel
    面向对象
    dedecms常用标签
    Illegal modifier for parameter *** , only final is permitted”
    import static和import的区别
    <<Effective Java>> 第四十三条
    java valueOf
    linux的shell编程
    DFA和NFA的区别
    发现一个正则网
  • 原文地址:https://www.cnblogs.com/xtxtx/p/9149508.html
Copyright © 2020-2023  润新知