22、委托delegate

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);
      }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,633評(píng)論 18 399
  • 1. 簡介 如果我們要把一個(gè)方法當(dāng)作另一個(gè)方法的參數(shù)來傳遞,那么我們就需要用到委托。簡單來講,委托是一種類型,可以...
    元宇宙協(xié)會(huì)閱讀 913評(píng)論 0 1
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,995評(píng)論 0 11
  • 大家好,我是北京菜鳥在線的unity3d高級(jí)講師范老師 直接上代碼 首先,我們需要知道的是,委托是一種類型,它可以...
    土豆_9724閱讀 346評(píng)論 0 0
  • 這本書是通過別人的推薦才開始看的,我必須看書比較慢,所以現(xiàn)在也只看了前面的部分而已。這本書最先吸引我的是標(biāo)題中的“...
    JennyHua閱讀 1,309評(píng)論 0 0

友情鏈接更多精彩內(nèi)容