日期:2014-05-16 浏览次数:21056 次
又到了一月一度的月底交话费时间了,广大的手机用户们表示无比惆怅,移动公司表示无比欢欣。
这不,放血坐拥“土豪金”的菜鸟程序员小丁由于白天业务繁忙、晚上娱乐至上,手机费也如“滚滚长江东逝水”般被“浪花”淘尽了。无奈工资未发,急也白瞎,只能苦苦哀求同租在一间公寓里的舍友小杨先给“垫点儿”。
于是乎,委托就来了~~~
委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托可以看做是对函数的抽象,是函数的“类”,委托的实例代表一个具体的函数,可以像其他任何方法一样具有参数和返回值。(委托不简单!)
如果把委托看成一种数据类型的话,那么它所能接收的数值只能是一个函数的地址。
乍一看,说的云遮雾绕的。翻译成“小丁的故事”就是:小丁手机欠费了,“某个函数”通知小杨先替他交点儿。
PS:看看委托多简单!(作者你说的是真的么……)
下面看这个例子的代码。
namespace 委托例子 { class Program { static void Main(string[] args) { Ding xiaoding = new Ding("小丁"); //实例化xiaoding Yang xiaoyang = new Yang("小杨"); //实例化xiaoyang xiaoding.需充值100元 += new Ding.小丁欠费(xiaoyang.交话费); //把小杨的“交话费”方法通过实例化委托“小丁欠费”登记到小丁的“需充值100元”事件中。“+=”表示“add_需充值100元”。 xiaoding.急需交费(); } } class Ding //小丁类 { private string name; //声明名字私有变量 public Ding(string name) //传入小丁的名字 { this.name = name; } public delegate void 小丁欠费(); //声明一个委托"小丁欠费" public event 小丁欠费 需充值100元; //声明事件“需充值100元”,事件类型为委托“小丁欠费” public void 急需交费() //急需交费的方法 { Console.WriteLine("真不幸,我是{0},手机欠费了",name ); if (需充值100元 != null) //在执行急需交费方法时,如果“需充值100元”委托中有对象登记事件,则执行“需充值100元”方法 { 需充值100元(); } } } class Yang //小杨类 { private string name; public Yang (string name) { this.name=name; } public void 交话费() { Console.WriteLine("我是{0},我来给你交话费", name); } } }
输出:真不幸,我是小丁,手机欠费了
我是小杨,我来给你交话费
仔细看看,发现委托原来真的不难。
在上面的例子中,委托只搭载了一个方法“需要交话费”。实际上,一个委托可以搭载多个方法,所有的方法会被依次唤起,而且委托对象所搭载的方法不需要属于同一个类。
但是!委托的前提是所搭载的所有方法必须有相同的原型和形式,也就是拥有相同的参数列表和返回值类型。
总结:委托是设计模式中“观察者模式”的产物,应用好委托能大大降低类之间的耦合度,相当于第三方的作用。委托除解耦思想外,最独特的地方就是它的接收函数