請看以下的程式碼
其中和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);
}
}
}
}
留言列表