C#经典编程——(生活中的猫叫,老鼠跑,主人被吵醒)

来源:互联网 发布:兰大网络与教育学院 编辑:程序博客网 时间:2024/05/01 06:06

有一次去面试的时候,面试官出了一个这样的生活问题

 请用联动效应描述出生活中的问题,猫叫,把正在偷食的老鼠吓跑了,然后主人被吵醒了,请写出相关的代码解决这样的问题!

咋一看没有思绪,不知道该如何下手,好在C#中提供了一个叫委托的机制,可以很好的解决这样的问题.

委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,混身不自在,本文将以上述的面试例子来简单的讲解下委托的用法.

首先我们要定义一个委托,语法为:

delegate void 名称()

例如 delegate void MyDelete()-----表示的是该委托应该与一个返回值为Void 并且没有参数的方法相互绑定

现在我们定义一个猫类:

public class Cat
    {
        /// <summary>
        /// 声明一个委托
        /// </summary>
        public delegate void MyDelete();


    }

该类就声明了一个委托,下面我们把这个类给补充完整如下:

 public class Cat
    {
        /// <summary>
        /// 声明一个委托
        /// </summary>
        public delegate void MyDelete();
        /// <summary>
        /// 猫叫的事件(猫叫了以后干什么)
        /// </summary>
        public event MyDelete CatShut;

        /// <summary>
        /// 定义一个猫叫的方法
        /// </summary>
        public void MyCatShut()
        {
            Console.WriteLine("小猫叫了一声....");
            //如果这个事件不是空的(就意味着猫叫的事件是被订阅的)
            if (CatShut != null)
            {
                CatShut();
            }
        }
    }

---我们已经把猫的类写好了

那么 就需要老鼠和主人来订阅猫叫的事件,我们就需要定义一个老鼠类和主人类,如下

 public class Mouse
    {
        /// <summary>
        /// 老鼠跑的方法
        /// </summary>
        public void Run()
        {
            Console.WriteLine("老鼠听到猫叫,就开始逃窜");
        }
    }

老鼠就只有一个方法 跑的方法 因为当老鼠听到猫叫的时候就要开始跑了

同理,主人也该有一个醒来的方法,如下

public class People
    {
        /// <summary>
        /// 主人起床的方法
        /// </summary>
        public void WakeUp()
        {
            Console.WriteLine("主人被吵醒了");
        }
    }

现在,事件源(猫)和事件订阅者(老鼠和主人)都已经有了,那么该如何去订阅猫叫的事件呢?

我们就需要在测试类中写出一个这样的方法,如下:

 class Program
    {
        static void Main(string[] args)
        {
            Cat c = new Cat();--实例化一个猫类
            Mouse h = new Mouse();---实例化一个老鼠类
            People p = new People();---实例化一个主人 类
            c.CatShut += new Cat.MyDelete(h.Run);//老鼠注册了一个猫叫的事件
            c.CatShut+=new Cat.MyDelete(p.WakeUp);//主人也注册了一个猫叫的事件
            c.MyCatShut();  --猫叫(如果不调用该方法,那么猫就不会叫,猫不会叫那么主人和老鼠就不会醒和跑了)
            Console.ReadLine();
        }

       
    }

运行效果就会看到一个联动的效果,其实也是一种设计模式 观察者模式

此时猫是一个事件源 (就好比移动公司推出的某项业务),而主人和老鼠呢都是事件的订阅者(好比有客户去开通这个业务)那么,当猫叫的时候,主人和老鼠都收到相应的信息(只要订阅了移动公司的这项业务,就都能收到短信,而没有订阅的客户就不能收到短信)。但是,当老鼠和猫已经和谐了以后,老鼠不在怕猫了,就不在订阅猫叫的事件,那么下次猫在叫的时候,老鼠就不会跑了(当我们取消了移动公司的某项业务那么下次它就不会发送消息给我们 是一个道理)

 

这就是一个简单的通过事件 委托机制的一个联动编程题目,对于初学者来说还有一定的瓶颈,好事多磨,希望大家能在以后的学习中勇攀高峰,本文旨在这里起一个抛砖引玉的作用.

 

 

 

 

原创粉丝点击