Delegate Event
目標:
實務上遇到需要計算每家廠商的交易手續費,但是每家廠商計算手續費的方法不同,所以利用Delegate event去指定各家廠商的交易手續費算法(Method)。
實務上遇到需要計算每家廠商的交易手續費,但是每家廠商計算手續費的方法不同,所以利用Delegate event去指定各家廠商的交易手續費算法(Method)。
一、 以Windows Form專案來作範例
2. Merchant\IMerchant.cs … 廠商Interface
Merchant\CMerchant.cs ... 廠商Class
CalFeeMethod.cs ... 手續費計算方法
Form1.cs
Merchant\CMerchant.cs ... 廠商Class
CalFeeMethod.cs ... 手續費計算方法
Form1.cs
二、 IMerchant.cs
1. 程式碼
public delegate void CalFeeHandler(double dFee_Pt, double dNum);
public interface IMerchant
{
//廠商代號
String Merchant_No {get; set; }
//手續費
double Fee_Pt { get; set; }
//計算手續費的事件
event CalFeeHandler CalFee;
}
2. →宣告一個delegate:CalFeeHandler
→在介面指定一個delegate event:CalFee
→在介面指定一個delegate event:CalFee
三、 CMerchant.cs
1. 程式碼
public class CMerchant : IMerchant
{
String sMerchant_No; //廠商代號
double dFee_Pt; //手續費
public event CalFeeHandler CalFee; //計算手續費的事件
/* 建構子 */
public CMerchant(String m_id)
{
sMerchant_No = m_id;
}
/* Merchant_No */
public String Merchant_No
{ //Get and Set … 省略 }
/* Fee_Pt */
public double Fee_Pt
{ //Get and Set … 省略 }
/* 觸發CalFee這個Event */
public void Print_Fee(double dNum)
{
if (CalFee == null) //未指定手續費時...
{
Console.WriteLine("未指定手續費計算事件!");
}
else //讓 CalFee 這個delegate event計算手續費
{
CalFee(dFee_Pt, dNum);
}
}
}
2. 重點是Print_Fee這個方法,因為在用這個class時,你可以指定event所對應的方法,卻不能直接呼叫它。 所以必須用呼叫Print_Fee來觸發CalFee這個事件。
另外CalFee帶入的值必須和宣告delegate當時的帶入值型態和數量一致。
另外CalFee帶入的值必須和宣告delegate當時的帶入值型態和數量一致。
四、 CalFeeMethod.cs
1. 程式碼
public class CalFeeMethod
{
/* 手續費 = 交易筆數*手續費趴數 */
public static void CalFee_by_TransCnt(double dFee_Pt, double dCnt)
{
double dFee = dCnt * dFee_Pt;
Console.WriteLine("手續費 = 交易筆數*手續費%=" + dFee.ToString());
}
/* 手續費 = 交易金額*手續費趴數/100 */
public static void CalFee_by_TransAmt(double dFee_Pt, double dAmt)
{
double dFee = dAmt * dFee_Pt / 100;
Console.WriteLine("手續費 = 交易金額*手續費%/100=" + dFee.ToString());
}
}
2. 這裡就是放我們要計算手續費演算法的地方。 只要注意這些方法的回傳值型態和傳入值跟delegate event相同就好了。
五、 Form1.cs
2. 程式碼
foreach (String sM_No in lb_Mno.Items)
{
CMerchant myMerchant = new CMerchant(sM_No);
Console.WriteLine("廠商代號:" + myMerchant.Merchant_No);
switch (sM_No)
{
case "123456":
myMerchant.Fee_Pt = 0.8;
myMerchant.CalFee += CalFeeMethod.CalFee_by_TransCnt;
break;
case "888888":
myMerchant.Fee_Pt = 0.5;
myMerchant.CalFee += CalFeeMethod.CalFee_by_TransAmt;
break;
default:
myMerchant.Fee_Pt = 0;
break;
}
//列印手續費
myMerchant.Print_Fee(1000);
Console.WriteLine("");
}
3. → 用 myMerchant.CalFee += CalFeeMethod.CalFee_by_TransCnt; 去指定delegate event的方法。
→ 因為333333這家廠商我沒有指定計算手續費的方法,所以會顯示以下結果….
→ 因為333333這家廠商我沒有指定計算手續費的方法,所以會顯示以下結果….
特約機構代號:123456
手續費 = 交易筆數*手續費%=800
特約機構代號:888888
手續費 = 交易金額*手續費%/100=5
特約機構代號:333333
未指定手續費計算事件!
六、 利用delegate event,未來有新廠商的時候,我只要讓程式知道這家新廠商是用哪一種算手續費的方法,不用另外在程式作判斷了~ 雖然一開始寫有點辛苦,後面倒是比較好維護!
沒有留言:
張貼留言