白话“委托的使用”
关于委托的使用,长期以来一直令人困惑。很多书籍上的解释,不是似是而非,就是只讲语法,难以令人信服。
委托形似方法。如果我们就委托来说方法,是一个永远也解不开的扣。
委托实例时,接受一个方法,来帮助我们处理事情。那为什么不直接使用方法呢?如同,我们叫大管家张三通知仆人李四去买醋,那为什么我们不直接通知仆人李四呢?
有人说,当有n个仆人时(n个方法)供我们选择时,这样代码清楚,效率高。但我想,只是这样的理由,那不足以发明委托这个对象。
个人认为:
如果我们告诉大管家需要买醋时,我们还没有雇到仆人,连大管家都不知道该找谁去买时,这个逻辑就成立了;也就是说,当我们定义委托时,它所接受的方法,根本就不存在,也没有地方去找。但是,代码还要编下去,并且,这个方法的实现有可能是非常复杂的,没有规律可循的。
举个例子:
public class 旅游
{
public delegate int 到北京的时间();
}
public interface I来自天津
{
int 天津();
}
public interface I来自海南
{
int 海南();
}
public interface I来自纽约
{
int 纽约();
}
public class 去北京:旅游,I来自天津,I来自海南,I来自纽约
{
int 天津()
{
汽车n小时;
}
int 海南()
{
汽车n小时 + 飞机n小时
}
int 纽约()
{
汽车n小时 + 轮船n小时 + 火车n小时
}
static void Main(string[] args)
{
到北京的时间 d = new 到北京的时间( "方法名" );
int s = d();
Console.WriteLine(s);
}
}
这是自己对委托这个对象的认知,用白话来给于诠释。但自己心中也没有实底,欢迎大家讨论!
抱歉!有朋友说上面代码看不懂,这是由于上面的代码只是逻辑说明,没有严格的推导,故重写一个可以运行的程序来说明:(大家可以试一试)
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
//--------------------------------------------------------------------------------------
public class 基类
{
public static string sName; // 声明字段
public delegate string 委托(); // 声明委托
public static string 你是谁( 委托 d ) // 定义方法,将委托作为参数
{
sName = d(); // 关键理解:获取委托的签名,相当于获取那个未知方法的签名!
return sName; // 返回参数
}
public static void 告诉你() // 定义方法
{
Console.WriteLine( sName ); // 显示
Console.Read();
}
}
// 注意:因为委托接受的方法没有定义,所以将委托做为一个方法的签名,可以使程序可以继续编下去。
//--------------------------------------------------------------------------------------
class 子类: 基类
{
public static string 仆人() // 在子类中定义,委托将要接受的方法
{
return "我叫李四,来自子类";
}
static void Main(string[] args)
{
委托 d = new 委托( 子类.仆人 ); // 实例委托
你是谁( d ); // 将委托传入方法
告诉你(); //
}
}
//--------------------------------------------------------------------------------------
}

浙公网安备 33010602011771号