一、樣本: 使用者輸入兩個運算元,再選擇運算方法(加減乘除),程式即可算出結果。這個樣本的關鍵之處在於它使用委託在運行時動態地調用不同的方法。
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();
}
更多的委託技術內幕可以參見另一篇日記。