当前位置: 首页 > news >正文

[C#]猫叫人醒老鼠跑 C#的委托及事件

    讲解了一下委托跟事件的应用,说实话这个东西听起来还是一头雾水,虽然学会怎么用,但是还没搞明白需要在什么时候用到这个,后来我们经理给我举了个例子,让我做一个经典的委托和事件的例子,就是猫叫人醒老鼠跑。

      首先很简单,需要定义猫,人跟老鼠三个类,分别命名为Cat,People,Mouse,在这里我还写了一个接口,里面写了一个void Action(),用以实现多态,People和Mouse两个类继承了这个接口并实现,然后定义一个委托public delegate void Scream(), 返回类型为void,然后在Cat类中定义一个事件public event Scream scream,用来接下里的事件绑定。接下来要写一个虚拟类,来作为一个观察者,而Cat类是作为一个被观察者,当Cat类中的方法被调用以后,触发绑定在事件里面的方法,这里我写了一个虚类来扮演观察者的角色,Cat类做为被观察者,当Cat类被调用呢,观察者告诉另外两个类Cat类已经被调用,然后这两个类各自实现相应的方法,也就是说观察者观察到猫叫了一声以后告诉人和老鼠,人就醒过来,而老鼠就开始跑,这就是同一件事情引发的不同角色的不同动作,而虚类的构造函数方法来绑定虚方法Action()。虚类的代码如下:

      public abstract class Observer : IScream
    {
        protected Cat cat{get;set;}
        public Observer(Cat cat)
        {
            this.cat = cat;
            this.cat.scream += Action;
        }
        public abstract void Action();
    }

      人跟老鼠的类继承自这个虚类,通过重写虚方法Action来达到实现多态的效果,然后通过base来调用父类的构造函数,人跟老鼠类的代码如下:

    class Person:Observer
    {
        public override void Action()
        {
            Console.WriteLine("主人醒来了");
        }
        public Person(Cat cat) : base(cat)
        {
        }
    }  

     class Mouse : Observer
    {
        public override void Action()
        {
            Console.WriteLine("老鼠跑了");
        }
        public Mouse(Cat cat) : base(cat)
        {
        }
    }

     这样定义好了以后,最后只要调用Cat类的方法就能实现预期效果,整体代码如下:

 public delegate void Scream();
    public class Cat
    {        
        public event Scream scream;         
        public void Action()
        {
            Console.WriteLine("猫叫了一声");
            scream();
        }        
    }

    public abstract class Observer : IScream
    {
        protected Cat cat{get;set;}
        public Observer(Cat cat)
        {
            this.cat = cat;
            this.cat.scream += Action;
        }
        public abstract void Action();
    }

    class Mouse : Observer
    {
        public override void Action()
        {
            Console.WriteLine("老鼠跑了");
        }
        public Mouse(Cat cat) : base(cat)
        {
        }
    }

    class Person:Observer
    {
        public override void Action()
        {
            Console.WriteLine("主人醒来了");
        }
        public Person(Cat cat) : base(cat)
        {
        }
    }   

    class Program
    {        
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Person p = new Person(cat);
            Mouse m = new Mouse(cat);
            cat.Action();
            Console.ReadLine();
        }
    }















本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366180,如需转载请自行联系原作者

相关文章:

  • 3星|《财经天下周刊》2017年21期:海外购几乎是亚马逊中国的最后一根救命稻草...
  • java对象与json对象间的相互转换
  • ELK日志分析单机系统详解
  • IDEA Git 配置及使用
  • ssh批量管理分发项目实战介绍与实践
  • Linux防火墙详解(一)
  • Linux内核驱动基础(一)常用宏定义【转】
  • xshell使用xftp传输文件、使用pure-ftpd搭建ftp服务
  • hibernate增删改
  • maven学习:jetty插件与Tomcat插件
  • 聊下 git 多账户问题
  • Datanode Hang with High thread blocked
  • 安装heartbeat
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • 菜鸟学Linux 第065篇笔记 nfs
  • 【comparator, comparable】小总结
  • android图片蒙层
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Consul Config 使用Git做版本控制的实现
  • laravel with 查询列表限制条数
  • Objective-C 中关联引用的概念
  • RxJS: 简单入门
  • spring boot 整合mybatis 无法输出sql的问题
  • windows下如何用phpstorm同步测试服务器
  • 从零开始的无人驾驶 1
  • 讲清楚之javascript作用域
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 温故知新之javascript面向对象
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 白色的风信子
  • Linux权限管理(week1_day5)--技术流ken
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #传输# #传输数据判断#
  • (C语言)二分查找 超详细
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)拼包函数及网络封包的异常处理(含代码)
  • ..回顾17,展望18
  • .bat文件调用java类的main方法
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core 6 集成和使用 mongodb
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Remoting学习笔记(三)信道
  • .Net Web项目创建比较不错的参考文章
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET实现之(自动更新)
  • .NET使用存储过程实现对数据库的增删改查
  • @31省区市高考时间表来了,祝考试成功
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @property @synthesize @dynamic 及相关属性作用探究
  • @property括号内属性讲解
  • @SuppressWarnings注解
  • [1204 寻找子串位置] 解题报告