我们可不可以将两个以上的方法委托给一个对象呢?当然可以。多播委托就是指引用多个方法委托,它也是一个委托,当调用委托时,它连续调用每个方法,只要这些方法的签名与委托的定义相同。
为了把委托的单个实例合并为一个多播委托,委托必须是同类型的,返回类型必须是void,不能带输出参数(但可以带引用参数),如果委托是有返回值的函数,则只能调用最后一个委托函数。
当调用多播委托里,委托所表示的每个方法依次调用。如果有任何参数,它们将用于所有的方法。
多播委托: 1.委托声明包含的方法返回值必须为void,否则会抛出run-time exception。 2.使用“+”、“+=”添加方法,“-”、“-=”删除方法。 3.声明和实例化都和其他委托没有什么不同。
多播委托的示例程序:
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp1 {
//声明一个委托 public delegate void msg();
//编写一个类 class messges { //messges类下的一个成员方法m1 public static void m1() { Console.WriteLine("方法一被huashanlin调用"); }
//messges类下的一个成员方法m2 public static void m2() { Console.WriteLine("方法二被huashanlin调用"); }
//messges类下的一个成员方法m3 public static void m3() { Console.WriteLine("方法三被huashanlin调用"); } }
//另一个类 class Program { //该类下包含的主函数 static void Main(string[] args) { //实例化一个委托,并封装messges类中的一个方法m2 msg ms = new msg(messges.m2);
//在原有的封装了一个m1方法的委托实例中再封装进一个新
的方法m1 ms = ms + messges.m1; //或者上面的语句可以写成ms += messges.m1;两者的效果
是一样的
//以下为该委托实例封装第三个方法 ms += messges.m3;
//调用该委托实例,那么由于多播委托之后调用该委托就要
执行完此封装进去的三个方法 ms();
} } }
//注:deletge保存的方法签名是以hash队列的形式存在的
多播委托示例程序二: delegate void Delegate_Multicast(int x, int y); Class Class2 { static void Method1(int x, int y) { Console.WriteLine("You r in Method 1"); } static void Method2(int x, int y) { Console.WriteLine("You r in Method 2"); } public static void Main() { Delegate_Multicast func = new Delegate_Multicast(Method1); func += new Delegate_Multicast(Method2); func(1, 2); // Method1 and Method2 are called func -= new Delegate_Multicast(Method1); func(2, 3); // Only Method2 is called } }解析: 上面的示例程序分别定义了名为method1 和 method2的两个接受整型参数、返回类型为void的方法。 在Main函数里使用下面的声明创建委托对象: Delegate_Multicast func = new Delegate_Multicast(Method1); 然后使用+= 来添加委托,使用-=来移除委托。
|
请发表评论