单播委托与多播委托的区别

isofug 2013-04-03 09:09:01
求讲解多播委托与单播委托 在线等
...全文
633 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2013-04-09
  • 打赏
  • 举报
回复
单播委托运行效率高,大都数函数传递都只需要单播委托。不知道微软抽什么筋,竟然被干掉了。
  • 打赏
  • 举报
回复
我们先写一个例子看看
public class 机器
{
    virtual public object Run()
    {
        return "运行";
    }

    virtual public void combine(机器 x)
    {
        throw new NotImplementedException();
    }

    public virtual IEnumerable<机器> GetInvocationList()
    {
        return new 机器[] { this };
    }
}

public class 多机器 : 机器
{
    private List<机器> lst = new List<机器>();

    public override void combine(机器 x)
    {
        lst.Add(x);
    }

    public override IEnumerable<机器> GetInvocationList()
    {
        return lst;
    }

    public override object Run()
    {
        object result = null;
        foreach (var x in lst)
            result = x.Run();
        return result;
    }
}
以现在的OOP设计原则来看,我们应该坚决反对这种程序。不是说能执行就行了,我们当让还要求逻辑上更自然,能够更长久地使用(当然任何真理都有被推翻的那一天)。 不自然地继承关系,与一般人的理解有冲突的东西,当然应该尽早重构。就算微软不改,我们也不应该学微软。
  • 打赏
  • 举报
回复
嗯,sorry,上面是我写的有误区了。 我们的 delegate 就算被实现为 Delegate,它也支持 combine 等方法,虽然它返回了一个声明为 Delegate 的东西而实际上它真实的类型是 MulticustDelegate。也就是说,在运行时它自己多态地返回了 MulticustDelegate,而不是实例化为 Delegate 的对象。
  • 打赏
  • 举报
回复
引用 3 楼 hztltgg 的回复:
多播委托继承单播委托,所有自己定义的委托都继承多播委托,单播委托是个设计缺陷,原本想区分这两者,后来发现没必要。
是这样的。 我们今天使用的关键字 delegate 被编译器实现为 MulticastDelegate,而不是 Delegate。这就是关键!
三五月儿 2013-04-05
  • 打赏
  • 举报
回复
引用 4 楼 isofug 的回复:
能不能给个例子 说的我不明白
多播委托示例程序:
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的方法。 多播委托: (1)多播委托包含一个以上方法的引用。 (2)多播委托包含的方法必须返回void,否则会抛出run-time exception。
threenewbee 2013-04-03
  • 打赏
  • 举报
回复
单个永远是多个的特例。
isofug 2013-04-03
  • 打赏
  • 举报
回复
能不能给个例子 说的我不明白
hztltgg 2013-04-03
  • 打赏
  • 举报
回复
多播委托继承单播委托,所有自己定义的委托都继承多播委托,单播委托是个设计缺陷,原本想区分这两者,后来发现没必要。 区别是单播只能委托一个,多播可以委托多个
isofug 2013-04-03
  • 打赏
  • 举报
回复
不明白 求解释
linrachel 2013-04-03
  • 打赏
  • 举报
回复
这有什么好说的。。。命名说明一切。

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧