关于委托自己的一些理解(作为读书笔记)

    以前提到委托,总感觉不好理解,简单意义是上说委托可以理解为函数的指针,可以把一个方法作为一个参数带入到另一个方法中。本人理解,请大牛指

1.首先看一个简单的例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateDemo
{
    public class Program
    {
       
        //声明一个猫叫,处理主人醒,老鼠跑
        //public delegate void MyEventHandle();

        public delegate string MyDelegate(string name, int age);
        static void Main(string[] args)
        {
            //第一种方式:作为被委托调用的方法,声明为静态方法是可以调用;
            MyDelegate md = new MyDelegate(show);

        }

        private static string show(string name, int age)
        {
            return "你的名字是:" + name + "你的年龄是:" + age;
        }

 

    首先声明一个委托Mydelegate,当show方法需要被委托是,new一个委托对象md,md就可以作为show方法的代表,md(“liupeng”,23)来处理事情。此时注意的是show方法声明的为静态方法。

运行结果如图:

那么,不声明为静态的方法能否调用了?答案是当然可以,这就是委托给我们带来的好处。此时通过对象也可以调用非静态的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateDemo
{
    public class Program
    {


        public delegate string MyDelegate(string name, int age);
        static void Main(string[] args)
        {
           
         //第二种方式:不是声明为静态的方法,作为参数被委托调用是需要实例化对象才可以被调用
            Program pg = new Program();
            MyDelegate md1 = new MyDelegate(pg.show1);
            Console.WriteLine(md1("liupeng", 23));
            Console.ReadKey();



        }

        private static string show(string name, int age)
        {
            return "你的名字是:" + name + "你的年龄是:" + age;
        }

        private string show1(string name, int age)
        {
            return "Hello" + name + "你的年龄是:" + age + "你已经成年啦!";

        }


    }

运行结果如图:

如此这是基本的委托实例。下面来看看较为经典的一道面试题目:简单说是,猫叫,主任醒,老鼠跑。(要求考虑到彼此间的连锁反应)

1.首先猫叫,引起主人醒和老鼠跑同时发生,那么就要求能够同时处理这两个事件,就好比今天项目经理要求你去见客户,但是你今天又有开发任务要完成,这两件事情必须完成,你只能处理一件事情,要想都办理,那么就得委托同时帮忙处理,所以委托也可以这么理解:当要处理的时间同时发生时,可以用委托去处理。(如有不当之处,请大牛指正,感谢!)

2.有了分析之后,那么就可以开始coding啦,三个类Cat 、Mouse、Person是所必需的,在Cat类里面声明委托的变量,定义Cat的行为:猫叫(CatCry()方法),自此分别在Mouse类、Person类中定义各自的行为,其中关键的一点就是把三种行为委托到Cat对象进行处理,cat对象调用委托方法处理传递进来的行为参数(各自的ACtion)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateDemo
{
    public class Program
    {

        //声明一个猫叫,处理主人醒,老鼠跑
        public delegate void MyEventHandle();

        static void Main(string[] args)
        {

            //猫叫处理一系列反应
            Cat cat1 = new Cat();
            Mouse mouse = new Mouse(cat1);
            Person person = new Person(cat1);
            cat1.CatCry();//调用猫叫方法,引起连锁反应
            Console.ReadKey();


        }



    //关于面试的一道经典题目,猫叫,主人醒,老鼠跑
    //猫叫引起主人醒和老鼠跑,同时发生。
    public class Cat
    {
        public event DelegateDemo.Program.MyEventHandle eHandle;
        public void CatCry()
        {
            Console.WriteLine("睡了一觉,是时候工作啦抓老鼠啦!");
            if (eHandle != null)
            {
                eHandle();
            }
        }


    }

    public class Mouse
    {
        public void Run()
        {

            Console.WriteLine("兄弟们,黑猫醒啦,我们该逃跑啦!!Come On!");
        }

        public Mouse(Cat cat)
        {
            cat.eHandle += new Program.MyEventHandle(Run);
        }


    }

    public class Person
    {
        public void Wake()
        {
            Console.WriteLine("好烦人的黑猫,睡个觉都被吵醒啦!");
        }

        public Person(Cat cat)
        {
            cat.eHandle += new Program.MyEventHandle(Wake);
        }


    }

}

运行结果如图:

 

以上理解为本人菜鸟级别的,望各位大牛指导教育,小弟愿意虚心学习!!非常感谢!!!

 

posted @ 2014-08-10 01:41  Akon_Coder  阅读(326)  评论(0编辑  收藏  举报