委託使用樣本

來源:互聯網
上載者:User

一、樣本: 使用者輸入兩個運算元,再選擇運算方法(加減乘除),程式即可算出結果。這個樣本的關鍵之處在於它使用委託在運行時動態地調用不同的方法。

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();

}

 

更多的委託技術內幕可以參見另一篇日記。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.