在學習C#中時候很早就聽到過委托這個概念,我讀了許多文章都沒能理解它 的含義,園子裡好多是這麼解釋的:“委托相當與c++函數指 針...”
本人沒有學過C++,只模糊的記得在學C語言基礎的時候,對 指針的理解是這樣的,指針是一個本身不存放值的變量,它裡面存放的是另一個 變量的內存地址。所以使我聯想到了值類型變量和引用類型變量。
更是 糊裡糊塗的,在後來的工作學習中,漸漸的理解了它的含義。
問題:
1,委托到底是個什麼東東。
2,什麼時候能用到委托。
聲明:這裡,我們不去探討委托的原理,內部機制等等...只是想把我對委托的 理解,說出來...內容也僅供參考,歡迎改為前輩拍磚。
下面用白話和一 個很白的例子說明問題。
定義一個類,裡面有屬性,方法,有的方法是 通用的,我們可以實現它的代碼。有的方法需要在具體的調用時才能確定它應該 完成的功能,所以這裡定義一個委托,具體的執行代碼在調用時候再實現。這樣 就能根據實現代碼的不同完成不同的操作。覺得是多態的一種表示形式。
還不明白,那看下面這個很“白”的例子:
我們的需 求是這樣的
某飯店 老板讓 購物員去買菜,要買白菜和土豆,最後算出 總價格
老板說:“白菜的價格如果大於3.5元,就扣除白菜的雜質 ,扣除方法是 每1公斤減掉0.3公斤的雜質再買”
購物員:“ 那土豆也是用這個規則麼?”
老板說:“土豆按什麼規則, 扣不扣雜質你自己決定”
購物員暗想:“先去菜市場看看價 格如果土豆的價格大於2.5元就扣雜質。。。”
這裡姑且 買菜怎麼 買法有買方決定
下面實現我們的代碼
//買菜類
public class BuyVegetable
{
double CabbageMoney;
double MurphyMoney;
Code
/// <summary>
/// 買白菜
/// </summary>
/// <param name="price"></param>
/// <param name="amount"></param>
/// <returns></returns>
public void BuyCabbage(double price, double amount)
{
//這裡老板制定的買白菜的方案
// 如果買白菜的價格小於3,就不去雜,如果大於3去去雜
if (price < 3)
{
CabbageMoney = price * amount;
}
else
{
CabbageMoney = (price - 0.3) * amount;
}
}
因為只知道要買土豆,具體怎麼買現在決定不了,所以只能 定 一個 事件。
白話:怎麼買得到到了菜市場才能決定,可是無論怎麼樣都 得有買土豆這回事兒,無論到了菜市場怎麼決定都離不開“價格”和 “數量”這兩個條件,這裡就用到委托了,所以這個事件是委托類型 的。 delegateBuyMurphy(委托的定義在下面)
/// <summary>
/// 購買土豆事件
/// </summary>
public event delegateBuyMurphy eventBuyMurphy;
所以購買 土豆的方法是這樣的
Code
/// <summary>
/// 買土豆
/// </summary>
/// <param name="price"></param>
/// <param name="amount"></param>
public void BuyMurphy (double price, double amount)
{
//這裡只知道購買土豆,但是具 體用怎麼的規則購買,在購買的時候才能決定
MurphyMoney = eventBuyMurphy.Invoke(price, amount);
}
計算總金額
/// <summary>
/// 統計總體價格
/// </summary>
/// <returns></returns>
public double Stat()
{
return CabbageMoney + MurphyMoney;
}
}
購買土豆委托
/// <summary>
/// 購買土豆委托
/// </summary>
/// <param name="price"></param>
/// <param name="x"></param>
/// <returns></returns>
public delegate double delegateBuyMurphy(double price, double x);
使用上面的買菜 類開始購買
protected void Page_Load(object sender, EventArgs e)
{
//實例化類不用說了吧
BuyVegetable buyVegetable = new BuyVegetable();
//購買白 菜,老板制定的死規則不能改直接用這個規則吧。
buyVegetable.BuyCabbage(3.6, 8);
//采購員問:土豆多 少錢斤啊。
//售貨員說:4.8。
//采購員說:等會,我先算算怎麼 買法
//購物員開始制定定買土豆的規則buyVegetable_eventBuyMurphy( 代碼在下面)
//制定完了,這個規則是買土豆這事兒的,當然得給 買土豆這事兒
buyVegetable.eventBuyMurphy += new delegateBuyMurphy(buyVegetable_eventBuyMurphy);
//購買土豆
buyVegetable.BuyMurphy(4.8, 9);
//計算總 價格
this.Response.Write(buyVegetable.Stat());
}
//購買土豆的規則方法 buyVegetable_eventBuyMurphy
Code
/// <summary>
/// 購買土豆規則
/// </summary>
/// <param name="price"></param>
/// <param name="x"></param>
/// <returns></returns>
double buyVegetable_eventBuyMurphy(double price, double x)
{
if (price > 2.5)
{
return (price - 0.3) * x;
}
else
{
return price * x;
}
}