[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月前
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
123 7
|
4月前
|
C#
由浅入深理解C#中的事件
由浅入深理解C#中的事件
110 19
|
4月前
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
66 4
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
84 0
|
4月前
|
C#
C#中的委托(一)
C#中的委托(一)
38 1
|
4月前
|
存储 算法 安全
C#语言进阶(二)—事件全解
C#语言进阶(二)—事件全解
38 0
|
4月前
|
C# C++
C#语言进阶(一)—委托
C#语言进阶(一)—委托
50 0
|
6月前
|
C#
C#||委托和事件的实例
C#||委托和事件的实例
|
7月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
202 3
|
24天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
31 3