2015年12月15日 星期二

委派的宣告

在C#中,委派延伸於基底類別System.Delegate,但委派與一般類別的定義方法並不相同,委派通過關鍵字 delegate 來定義,例如:

public delegate void DoGreeting(string name);

即宣告一個新委派,它帶有一個string型別參數的方法。接個我們宣告一個叫 GreetHello的方法,如下:

public void GreetHello(string name, DoGreeting MakeGreeting)
{
    MakeGreeting(name);
}

我們發現,委派DoGreeting出現的位置與string相同。string是一個類別,所以DoGreeting應該也是一個類別或叫型別。我們可以這麼解釋委派,委派是同樣也是一個類別,它是針對方法所定義該方法的型別可以取代如if-else或是swich等語法,避免大量使用判斷語法造成程式大而無當的現象產生,這種動態地將方法型別設定與參數的做法,可以使程式具有更好的擴展性。範例如下:

using System;
namespace test_delegate
 {

  //定義委派,它定義了可以代表的方法的類型

 // EnglishGreeting or ChineseGreeting

  public delegate void DoGreeting(string name); //宣告委派

public class Program
{
   private static void EnglishGreeting(string name)
   {
      Console.WriteLine("Hello, " + name);
   }

   private static void ChineseGreeting(string name)
    {
      Console.WriteLine("你好, " +  name);
     }




     //它接收一個DoGreeting型別的方法做為參數
  //World 名稱
     //委派(EnglishGreeting or ChineseGreeting)

    private static void GreetHello(string name,DoGreeting MakeGreeting) //帶入委派(在方法                                     之前)
    {
       MakeGreeting(name); //此方法須傳入name參數,做為判斷是那一個型別是                  EnglishGreeting或是ChineseGreeting型別
     }

    public static void Main()
    {
       GreetHello("Jim",EnglishGreeting); //執行GreetHello方法,是EnglishGreeting型別
    GreetHello("張三",ChineseGreeting); //執行GreetHello方法,是ChineseGreeting型別
     }

   }

}

沒有留言:

張貼留言