zoukankan      html  css  js  c++  java
  • 抛开书本谈 委托,为什么需要委托,它成就了什么?

    博文技术有限,重在学习交流,有错误大家指正。

    思路:

    传统的方法调用------>委托的出现解决了什么问题---->委托的绑定方法----->总结


    1.传统的方法调用

    View Code
    class Program
    {
    static void Main(string[] args)
    {
    //如果某个人具有很多才艺
    //某一个人要展示它的才艺,我们就必须将下面的方法跳舞,唱歌 追个调用,架设追个人博学多才,具有100个才艺呢,我们就必须多次调用方法
    Dancing("Mr.w");
    Singing("Mr.w");
    }
    static void Dancing(string name)
    {
    Console.WriteLine("{0}会跳舞",name);
    }
    static void Singing(string name)
    {
    Console.WriteLine("{0}会唱歌",name);
    }
    }

    缺点:100个方法就要调用100次,如果每个人 对方法的需求不一样,就不能很好的处理了。有人想展示跳舞,有人想唱歌,更有想一起展示。

    2.引入 枚举试试看
     

    View Code
    public enum CY
    {
    dance,sing
    }
    class Program
    {
    static void Main(string[] args)
    {
    //如果某个人具有很多才艺
    //某一个人要展示它的才艺,我们就必须将下面的方法跳舞,唱歌 追个调用,架设追个人博学多才,具有100个才艺呢,我们就必须多次调用方法
    Dancing("Mr.w");
    Singing("Mr.w");
    //并且对于每一个人的才艺不一样的,可能需要增加才艺的方法,然后在Main函数内部再次调用,多么麻烦?
    //思考:要是有一种东西,可以一次性把这些才艺方法都调用了,我们该多幸福啊。-。-
    //好,以前好像学过枚举,试试看。(把方法罗列)
    PersonCY("Mr.w",CY.sing);

    }
    static void PersonCY(string name,CY one)
    {
    switch (one)
    {
    case CY.dance:
    Dancing(name);
    break;
    case CY.sing:
    Singing(name);
    break;
    default:
    break;
    }
    }
    static void Dancing(string name)
    {
    Console.WriteLine("{0}会跳舞",name);
    }
    static void Singing(string name)
    {
    Console.WriteLine("{0}会唱歌",name);
    }

    缺点:枚举虽然可以解决根据枚举的项判断出 谁想展示什么才艺,但是扩展性不好。
    思考:有没有一种方法,参数内带有:这个人的名字,然后自己想展示什么才艺,就自己带入?
    比如:方法(名字,我的才艺)


    3.这个时候单播委托出现了
    根据 方法(名字,我的才艺),这个类型知道:
    名字是 string 类型的,也就是string类
    我的才艺 是 方法,但是参数必须是有类型的,所以这里我们可以推断出我们要设计 一个类CLASS,这个类就是所有方法的类型。
    注:这里咱们轻易的看出了,委托起始就是定义 方法的类型。

    View Code
    public delegate void CYDL(string name);
    class Program
    {
    static void Main(string[] args)
    {
    //委托就是给方法 定义类型
    CYDL one =Dancing;
    CYDL two =Singing;
    CYDL[] cys = { one,two};

    PersonCY("Mr.w",one);
    PersonCY("Jack", two);
    PersonCY("Herry", cys);
    }
    static void PersonCY(string name,params CYDL[] ones)
    {
    foreach (var n in ones)
    {
    n(name);
    }
    }
    static void Dancing(string name)
    {
    Console.WriteLine("{0}会跳舞",name);
    }
    static void Singing(string name)
    {
    Console.WriteLine("{0}会唱歌",name);
    }
    }



    输出:
    Mr.w会跳舞
    Jack会唱歌
    Herry会跳舞
    Herry会唱歌
    哈哈,问题解决了,它没有利用switch语句,这样就可以根据不同的人,选择不同的才艺表演了。
    有人可能以为这样和写传统的方法调用 有什么区别,你注意到没?你注意到没:每次增加才艺,都必须在PersonCY()方法内修改,这样使用委托带入,即使
    我们增加了才艺的方法,也只需要在委托中带入即可。扩展性变优秀了。

    注:上面还解决,一个人多个才艺的问题,但是做法不标准,一般我们是利用 多播委托来完成的。


    4.多播委托

    View Code
    public delegate void CYDL(string name);
    class Program
    {
    static void Main(string[] args)
    {
    CYDL one = new CYDL(Dancing);
    one += new CYDL(Singing);
    PersonCY("Mr.w",one);
    }
    static void PersonCY(string name,CYDL one)
    {
    one(name);
    }
    static void Dancing(string name)
    {
    Console.WriteLine("{0}会跳舞",name);
    }
    static void Singing(string name)
    {
    Console.WriteLine("{0}会唱歌",name);
    }
    }

    思考:看起来还是不简便,能否让 PersonCY()也省略,直接让委托调用方法,答案是可以的。
    如下:

    View Code
    public delegate void CYDL(string name);
    class Program
    {
    static void Main(string[] args)
    {

    CYDL one = new CYDL(Dancing);
    one += new CYDL(Singing);
    one("Mr.w");
    }

    static void Dancing(string name)
    {
    Console.WriteLine("{0}会跳舞",name);
    }
    static void Singing(string name)
    {
    Console.WriteLine("{0}会唱歌",name);
    }
    }


    这样是不是 简便很多了?
    注:这里有个多播委托的小细节,+=必须委托第二个方法的时候使用,第一委托必须是=,不然会出现未赋值的错误。
    也可以使用-= 符号取消委托。


    总结:博文技术有限,写的有错误大家指正,从 为什么需要委托,认识到了 委托其实就是一个 定义方法类型的类,到 简化代码实现了委托绑定了方法。

  • 相关阅读:
    An internal error occurred during: "Launching MVC on Tomcat 6.x". java.lang.NullPointerException
    bat批处理文件夹内文件名的提取
    人脸识别-常用的人脸数据库
    WPF RichTextBox 做内容展示框 滚动条控制判定是否阅读完成
    WPF+通过配置文件生成菜单(Menu)+源码
    程序员也可以浪漫----倾情奉献一份你值得拥有的浪漫网站源码(情人节快来了~)
    这世界唯一的你:最美程序媛走红网络
    20分钟读懂程序集
    简介4种同步方法的实现
    共享文件夹:The user has not been granted the requested logon type at this computer
  • 原文地址:https://www.cnblogs.com/IAmBetter/p/2342443.html
Copyright © 2011-2022 走看看