2011年11月14日 星期一

[C#] Delegate Event (1)

Delegate Event

目標:
實務上遇到需要計算每家廠商的交易手續費,但是每家廠商計算手續費的方法不同,所以利用Delegate event去指定各家廠商的交易手續費算法(Method)。

一、                Windows Form專案來作範例
1.          專案內容:


2.          Merchant\IMerchant.cs … 廠商Interface
Merchant\CMerchant.cs ...
廠商Class
CalFeeMethod.cs ...
手續費計算方法
Form1.cs
3.          執行畫面

二、                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.          →宣告一個delegateCalFeeHandler
→在介面指定一個delegate eventCalFee

 
三、                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當時的帶入值型態和數量一致。


四、                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
1.          接下來就是直接拿來用了,底下用一個ListBox放三家廠商的代號,當按下「算手續費」按鈕時,就會計算各家廠商的手續費。
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這家廠商我沒有指定計算手續費的方法,所以會顯示以下結果….
 
特約機構代號:123456
手續費 = 交易筆數*手續費%=800

特約機構代號:888888
手續費 = 交易金額*手續費%/1005

特約機構代號:333333
未指定手續費計算事件!




六、                利用delegate event,未來有新廠商的時候,我只要讓程式知道這家新廠商是用哪一種算手續費的方法,不用另外在程式作判斷了~ 雖然一開始寫有點辛苦,後面倒是比較好維護

沒有留言:

張貼留言