委托使用示例
一、示例: 用户输入两个操作数,再选择运算方法(加减乘除),程序即可算出结果。这个示例的关键之处在于它使用委托在运行时动态地调用不同的方法。
1、先定义一个CalculateDelegate类型的私有字段curOpt,它将引用完成不同计算任务的方法:
//声明委托类型
public delegate double CalculateDelegate(double x,double y);
//当前操作类型
private CalculateDelegate curOpt;
2、定义一个方法,可以接收一个委托:
//完成计算工作
void DoCalculate(CalculateDelegate calmethod)
{
double x, y;
try
{
x = Convert.ToDouble(txtNumber1.Text);
y = Convert.ToDouble(txtNumber2.Text);
lblInfo.Text = String.Format("结果:{0}", calmethod(x, y));
}
catch (Exception e)
{
lblInfo.Text = String.Format("结果:非法数据");
}
}
上述方法接收一个CalculateDelegate类型的参数。通过这一参数,DoCalculate方法可以动态地调用示例程序中定义的加,减,乘,除 4个方法之一。
#region "四个完成操作的方法"
double Add(double x, double y)
{
return x + y;
}
double Subtract(double x, double y)
{
return x - y;
}
double Multiply(double x, double y)
{
return x * y;
}
double Divid(double x, double y)
{
return x / y;
}
#endregion
以下是动态根据选择的运算,来决定是调用哪个方法进行计算
private void txtNumber1_TextChanged(object sender, EventArgs e)
{
DoCalculate(curOpt);
}
private void txtNumber2_TextChanged(object sender, EventArgs e)
{
DoCalculate(curOpt);
}
private void rdoAdd_CheckedChanged(object sender, EventArgs e)
{
curOpt = this.Add;
DoCalculate(curOpt);
}
private void rdoSubtract_CheckedChanged(object sender, EventArgs e)
{
curOpt = this.Subtract ; //选择函数
DoCalculate(curOpt); //调用函数
}
private void rdoMultiply_CheckedChanged(object sender, EventArgs e)
{
curOpt = this.Multiply ;
DoCalculate(curOpt);
}
private void rdoDivid_CheckedChanged(object sender, EventArgs e)
{
curOpt = this.Divid ;
DoCalculate(curOpt);
}
二、使用委托实现多窗体通信。
点击从窗体按钮,主窗体会记录下对按钮的单击次数。
主从窗体间信息的传送利用了ShowInfoDelegate委托,定义如下:
//声明一个委托类型
public delegate void ShowInfoDelegate(string info);
从窗体定义了一个公有的委托类型字段,它将引用一个用于记录信息的方法:
public ShowInfoDelegate recorder;
在从窗体按键的单击事件中累加计数器,并通知“记录员(recorder)”记录
private int counter =0;//计数器
private void btnClickMe_Click(object sender, EventArgs e)
{
counter ++;
if (recorder != null)
recorder(counter.ToString());
}
真正完成记录工作的是主窗体中的Record方法:
//用标签显示信息,注意,此方法可以为Private的
private void Record(String info)
{
lblCount.Text = info;
}
主窗体构造函数的以下代码将上述代码传给从窗体的recorder字段,构筑了一座主从窗体对象间交换信息的桥梁。
public frmMain()
{
InitializeComponent();
//创建从窗体对象并显示
frmOther frm = new frmOther();
frm.recorder = this.Record; //向从窗体的委托变量赋值
frm.Show();
}
更多的委托技术内幕可以参见另一篇日记。