关于C#的委托(delegate)的自我理解

Posted on 2016-06-22 16:46  古水  阅读(349)  评论(0)    收藏  举报

 

首先描述一个事情,一个老师饿了,他要去买东西填饱肚子,然后他发现他的学生“小李”在玩,没学习,于是就委托“小李”去帮他买吃的。

根据这件事我们来分析:

首先得有个老师(老师饿了是他的方法,老师买东西也是他的方法),其次再有个学生(能接收老师发来的信息并存储,能去做事情,有名字)。

于是我们就可以创建两个类:

老师类:

public class Teacher
{
// 老师饿了,一般情况是老师自己去买吃的    
    public void Hungry1()
    {
        GoBuyEat("辣条");
    }
   public void GoBuyEat(string eatName)
    {
        Debug.Log("买的吃的是" + eatName);
    }
}

学生类:

public class Student
{
    public string name;
    public Student(string name)
    {
        this.name = name;
        eatName = string.Empty;

        Debug.Log(name);
    }

    private string eatName;

    public void GetTeacherEatName(string eatName)
    {
        this.eatName = eatName;
    }
  public void Do(Something something)   
    {    
        something(eatName);
    }
}


在主入口里面:

void main()
{
  Teacher t = new Teacher();
  t.Hungry();      
}

OK,仔细的人看到了在学生类中Do函数内有个Something了吧!这个就是委托。那我们把他声明创建出来。位置放在类外面作为全局。

// 定义委托 - 访问修饰符 delegate 返回值类型 委托名 (参数列表);
public delegate void Something(string name);


那有委托了,我们在老师类中再创建个饿了函数。

// 如果用委托的话,老师就会找个学生去买吃的
    public void Hungry2()
    {
        Student s = new Student("小李");
        s.GetTeacherEatName("辣条");
        Something a = new Something(GoBuyEat);

        s.Do(a);
    }

这里看不懂的话,我把学生的Do函数注释写上来估计大家都懂了。

// 学生有个行为,就是做事(注: 但是学生不知道做什么事,需要老师告诉,即需要老师把委托的事告诉学生,即把方法名告诉学生)
    // 怎么才能把方法名传递给学生呢?就需要通过委托这个方式,把老师要做的事,写成委托一样的格式,然后当成参数传递给委托,就行了
    public void Do(Something something)    // 委托可以像普通类型一样当作方法参数传递
    {
        // 委托可以像普通方法一样调用
        something(eatName);
    }

 

一般delegate用作回调。关于回调,我自己也没有完全理解清楚。


这个写在这里仅供自己忘记的时候回来参考,如果有错误,请大神指出,谢谢。如果能帮助到其他人,我也觉得很荣幸。

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3