1. 簡介
如果我們要把一個(gè)方法當(dāng)作另一個(gè)方法的參數(shù)來傳遞,那么我們就需要用到委托。
簡單來講,委托是一種類型,可以賦值一個(gè)方法。
可將任何可訪問類或結(jié)構(gòu)中與委托類型匹配的任何方法分配給委托。 該方法可以是靜態(tài)方法,也可以是實(shí)例方法。 這樣便能通過編程方式來更改方法調(diào)用,還可以向現(xiàn)有類中插入新代碼。
2. 語法:
寫在命名空間中或類中。
//定義一個(gè)委托,可賦值 返回值為空并且參數(shù)列表也為空的方法。
public delegate void PerformFunction1();
//定義一個(gè)委托, 可賦值 返回值為int,不需要參數(shù)的方法。
public delegate int PerformFunction2();
//定義一個(gè)委托, 可賦值 返回值為空,參數(shù)列表第一個(gè)為int,第二個(gè)為string,第三個(gè)為float的方法
public delegate void PerformFunction3(int age, string name, float height);
//定義一個(gè)委托, 可指向 返回值為bool, 參數(shù)列表為 任意兩個(gè)同類型的形參
public delegate bool Compare<in T>(T obj1, T obj2);
static void Main(string[] args)
{
// 兩種初始化方法
PerformFunction1 perform1 = new PerformFunction1(testFunction);
PerformFunction3 perform2 = printPersonDesc;
// 兩種調(diào)用方法
perform1();
perform2.Invoke(18, "張三", 1.87f);
}
static void printPersonDesc(int age, string name, float height)
{
Console.WriteLine(age + name + height);
}
static void testFunction()
{
Console.WriteLine("調(diào)用了testFunction");
}
將方法作為參數(shù)進(jìn)行引用的能力使委托成為定義回調(diào)方法的理想選擇。 例如,對(duì)比較兩個(gè)對(duì)象的方法的引用可以作為參數(shù)傳遞到排序算法中。
3 案例:
思考如下題目:
張三和李四,李四有幾只寵物,現(xiàn)在由于李四要出差,所以麻煩張三在吃完飯后,如果有剩下的飯菜,喂養(yǎng)一下李四的寵物。
李三可以通過工作來獲取食物,每次工作都會(huì)耗費(fèi)一些體力,當(dāng)體力為0時(shí),就無法工作了。 每吃一次飯恢復(fù)一點(diǎn)體力
本章已完結(jié)。。。
本章待續(xù)。。。
本章待續(xù)。。。
本章待續(xù)。。。
本章待續(xù)。。。
本章待續(xù)。。。
本章待續(xù)。。。
請(qǐng) 再思考一下。。。
再想一想。。。
下面有答案
Person類
class Person
{
private List<string> foodGoods = new List<string>();
public string name { get; set; }
public int age { get; set; }
public List<string> foods = new List<string>();
public int hungryProgress = 10;
public Random ran = new Random();
public Person()
{
foodGoods.Add("雞腿");
foodGoods.Add("鴨肉");
foodGoods.Add("牛肉");
foodGoods.Add("滿漢全席");
foodGoods.Add("火腿腸");
foodGoods.Add("泡面");
foodGoods.Add("榨菜");
foodGoods.Add("炒粉");
foodGoods.Add("腸粉");
foodGoods.Add("河粉");
foodGoods.Add("武大炊餅");
foodGoods.Add("燒烤");
foodGoods.Add("雞蛋蓋飯");
foodGoods.Add("刀削面");
foodGoods.Add("漢堡");
foodGoods.Add("意大利面");
foodGoods.Add("牛排");
}
//吃飯并且喂食
public void eatAndFed(PerformFedFunction fed)
{
eat();
if (this.foods.Count > 0)
{
fed(this.foods[0]);
}
else
{
Console.WriteLine("一不小心都吃完了");
}
}
public void work()
{
if (hungryProgress <= 0)
{
Console.WriteLine("沒力氣干活了");
}
else
{
hungryProgress--;
int index = ran.Next(0, foodGoods.Count);
foods.Add(foodGoods[index]);
}
}
private void eat()
{
int i = ran.Next(0, foods.Count);
int j = 0;
while(j < i)
{
Console.WriteLine("吃飯中....");
j++;
foods.RemoveAt(0);
hungryProgress++;
}
Console.WriteLine("吃完飯了.");
}
}
Dog類
class Dog
{
public string name { get; set; }
public void eat(string lastFoodName)
{
Console.WriteLine("名字為:"+ name +"的狗,正在吃:" + lastFoodName);
}
}
貓類
class Cat
{
public string name { get; set; }
public void eat(string lastFoodName)
{
Console.WriteLine("名字為:" + name + "的貓,正在吃:" + lastFoodName);
}
}
Program類
public delegate void PerformFedFunction(string foodName);
class Program
{
static void Main(string[] args)
{
Dog d1 = new Dog();
d1.name = "李四的小狗";
Cat c1 = new Cat();
c1.name = "李四的貓咪";
PerformFedFunction fedFun1 = d1.eat;
PerformFedFunction fedFun2 = c1.eat;
Person p1 = new Person();
p1.age = 20;
p1.name = "張三";
p1.work();
p1.work();
p1.work();
p1.work();
p1.work();
p1.eatAndFed(fedFun1);
p1.eatAndFed(fedFun2);
}
}