請看以下的程式碼

其中和delegate有相關的部分都用色塊加註了,它整體的概念是黃色的部分原本是一個判斷式,但如果你判斷式寫在class student裡,

那麼這個判斷式如果要修改就要進class student裡修改,另一個缺點是我沒辦法重複使用,這個程式我想判斷男女,另一個程式我想比對ID,那你的程式就沒有彈性,

這就是為什麼要用delegate的原因,因為我們要把判斷的邏輯放到class student外面.

所以先宣告了紅色的部分,delegate checkRule,而它的傳回值是布林.

接著我們把checkRule checkRuleResult放到了class student的輸入參數裡,也就是class student程式範圍中有需要判斷式時,都可以呼叫checkRuleResult.

果然我們將黃色的原來判斷式改成了checkRuleResult,這裡要特別強調的是,你可以觀察紅色和黃色的部分,它們的輸入參數型別及數量必須要一致.

這樣我們就成功的把class student裡原先的硬編碼改善了.

接下來就在呼叫端的部分,delegate既然是代理就一定有雙方,另一方的判斷邏輯就寫在了灰色的checkStudent這個函數裡,它的返回值和參數型別及數量都和紅色區塊代理宣告是一樣的,這就是我們主要判斷的程式碼.

所以我們現在要把delegate和checkStudent綁在一起,所以就使用了綠色區塊,它是將delegate實例化,可以看到new checkRule()中包含的就是判斷邏輯的checkStudent函數,完成後你就可以使用check1這個物件來使用判斷邏輯了.

接下來是程式去呼叫class student中的searchStudent的方法,符合方法的參數就是帶入一個studentList和一個型別為checkRule的check1.

最後就能列出所有性別為M的學生了.

public class program
{
    static void Main()
    {
        List<student> studentList = new List<student>();
        studentList.Add(new student() { ID = 101, Name = "Mark", Sex = "M" });
        studentList.Add(new student() { ID = 102, Name = "KiKi", Sex = "F" });
        studentList.Add(new student() { ID = 103, Name = "Benny", Sex = "M" });
        studentList.Add(new student() { ID = 104, Name = "Iris", Sex = "F" });
        checkRule check1 = new checkRule(checkStudent);
        student.searchStudent(studentList, check1);
        Console.ReadKey();
    }

    public static bool checkStudent(student stu)
    {
        if( stu.Sex == "M" )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

public delegate bool checkRule(student stu);

public class student
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Sex { get; set; }

    public static void searchStudent(List<student> studentList, checkRule checkRuleResult)
    {
        foreach(student student in studentList)
        {
            if( checkRuleResult(student) )
            {
                Console.WriteLine("{0}'s Sex is {1}", student.Name, student.Sex);
            }
        }
    }
}

arrow
arrow

    痞客興 發表在 痞客邦 留言(0) 人氣()