【委托】—是什么&怎么用&什么用

时间:2021-07-06 02:40:47

    最近在研究委托,在此跟大家分享一下。今天先说说委托是什么以及委托怎么用。

概念:

    官方的讲:委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看做是对函数的抽象,是函数的"类",委托的实例将代表一个具体的函数。

    另一种教容易理解的解释:委托是一个类,它定义了方法的类型,使方法可以当作另一个方法的参数来进行传递

    为了让大家更好地理解,我再举个例子: 

实例:

 public void isontime()//到时间了,该去接孩子了
        {
            Console.WriteLine("妈妈:还没下班,怎么办\n");           
        }
    没关系呀,有保姆呢,委托给保姆去做就可以了。

 class mother
    {
        //声明委托help,即定义了一个方法的类型为 help。
        public delegate void help();
        //定义了一个help委托类型的事件。也可以理解为委托的实例。
        public event help delegation;

        public void istime()//到时间了,该去接孩子了
        {
            Console.WriteLine("妈妈:时间到了,该去接孩子了\n");
            //委托给保姆
            delegation();
        }      
    }
    保姆类:

class nurse
    {
        public void getorder()//收到命令
        {
            Console.WriteLine("保姆:收到");
            Console.WriteLine("保姆:孩子接回来了\n");          
        }
    }
    那妈妈怎么告诉保姆去接孩子呢?其实很好说,保姆本就有接孩子的职责,所以只需要妈妈说一声到时间了就可以了。

class main
    {
        static void Main(string[] args)
        {
            //实例化
            mother mom= new mother();
            nurse nur=new nurse();
            nurses nurs = new nurses();
            //将保姆的方法注册到妈妈
            mom.delegation += new mother.help(nur.getorder); 
            //妈妈:时间到了
            mom.istime();
            Console.Read();
        } 
    }

结果:

【委托】—是什么&怎么用&什么用

      这就是委托,和生活中委托的意思很相近。

    现在再来理解关于委托的官方解释,应该就不难了:

    委托就是一种引用方法的类型:

    public delegate void help();定义了一个方法的类型,即方法的类型为help。把方法当做参数传递的时候可以这样:function(help function1);

    一旦为委托分配了方法,委托将与该方法具有完全相同的行为

    如上面的例子:mom.delegation += new mother.help(nur.getorder); 给委托delegation分配了getorder方法,之后delegation(),就相当于getorder();


下面再借上面的例子说说使用委托的流程:

流程:

该委托是用到事件的:

    1.声明一个委托:

        public delegate void help();

    2.声明一个事件:

        public event help delegation;

    3.将被委托的方法注册到事件:

        mom.delegation += new mother.help(nur.getorder); //+=是注册,-=是注销

    4.触发需要委托的方法:

        mom.istime();

    5.需要委托的方法中有事件的触发

         public void istime()//到时间了,该去接孩子了
            {
                Console.WriteLine("妈妈:时间到了,该去接孩子了\n");
                //委托给保姆
                delegation();
            }

    6.而事件中注册了被委托的方法,所以被委托的方法被执行

        public void getorder()//不用担心
            {
                Console.WriteLine("保姆:收到");
                Console.WriteLine("保姆:孩子接回来了\n");          
            }

    

总结:

    面向对象的思想:职责分明。自己不用做的事,就委托给该干这事的人。

    通过委托,实现了mother和nurse之间的解耦。即mother要用nurse的方法,但没有直接调用。

    提高了代码的可扩展性,如果此时mother还有别的事情,如要买菜,就可以把买菜委托给另一个nurse,这时,只需要再添加一个nurse类,里面写上买菜的方法,在主方法中将买菜注册到委托的事件中。就可以实现委托另一个nurse去买菜了。整个过程不会对原有程序进行任何改动。所以使用委托,提高了程序的可扩展性。