• 失业日志:2009年10月15日 猫 老鼠 人(一)


    猫 老鼠 人 理解委托和事件以及联动。
    今天准备了一下面试题,因为委托和事件我一直没有涉足,对这个一知半解,不太会,网上有一道面试题,大概意思就是,猫一叫,老鼠就跑,人就醒。要求猫叫后触发老鼠跑和人醒。
    没搞清委托之前,这样写最好。在猫的CryOut中增加老鼠跑或者人醒。
    Code

    但是这种方法不符合出题者的初衷,想想,如果一次猫叫有一只老鼠跑,另一次猫叫有两只老鼠跑,这样如何解决呢?难道修改CryOut代码?显然这样是错误的。

    这道题其实是要说明delegate委托和event事件的用法,以及接口和或者抽象类的使用,这里先不说接口和抽象类。
    委托是c#中一种类型。
    一个委托变量中,存放了多个符合委托所要求的函数的指针(地址),当委托执行时,依次执行这些函数。
    而事件,就是委托的一种特殊的变量。
    以上这两个问题,我想了好久才搞明白。

    由此,猫和老鼠以及人的问题就可以理解为,给猫定义一个委托变量,然后把老鼠和人的在听见猫叫后的反应函数放到这个委托变量中,当猫叫时,执行这个委托,自然就执行了这个委托中所包含的函数。
    首先定义一个委托
    delegate void MyEventHandler();
    然后分别在老鼠和人中定义相关符合委托调用的函数。
    class Mouse{
                public void MouseRun()
                {
                    Console.WriteLine("Let's go,Friends");
                }
    }
    class People{
                public void PeoPleRun()
                {
                    Console.WriteLine("I'm Waking");
                }
    }
    因为是猫叫触发,因此这个委托变量应该定义在猫的类中,并且在猫叫的时候执行委托中的函数。
    class Cat{
          public MyEventHandler myHandler;
          public void Cry(){
                 Console.WriteLine("I'm crying");
                 if(myHandler!=null){ myhandler(); }
          }
    }
    好的,差不多了,剩下来就是如何把老鼠和人的函数增加到这个myHandler变量中去。这个可以用老鼠和人的构造函数,将Cat的实例传入构造函数,然后在委托中增加函数。贴下全部代码。
    Code

    OK,可以说的是,event关键字可以不要,至于要不要event,还弄的不是很清楚。以后再研究下。
    下次再将老鼠和人的方法抽象一个接口。
    以上的描述或有不太准确的地方,因为都是个人理解,可能会和真词不同,理解。
  • 相关阅读:
    Redisson分布式锁学习总结:公平锁 RedissonFairLock#lock 获取锁源码分析
    Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析
    Redisson分布式锁学习总结:公平锁 RedissonFairLock#unLock 释放锁源码分析
    npm更改为淘宝镜像
    博客园统计阅读量
    自动下载MarkDown格式会议论文的程序
    修改linux ll 命令的日期显示格式
    Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存
    Log4j2 Jndi 漏洞原理解析、复盘
    一个菜鸡技术人员,很另类的总结
  • 原文地址:https://www.cnblogs.com/poplau/p/1584229.html
Copyright © 2020-2023  润新知