回调与对象引用

时间:2018-09-22 04:22:07

标签: c# oop design-patterns callback

设计问题:假设我们有父对象和子对象。有时,子对象说“父母,您必须更新状态”。因此,

  1. 将父对象引用传递给子构造器

  1. 将父对象 callBack函数传递给子构造函数

当然,除了必须撤消孩子的情况以外,除了使用此callBack函数外,任何机会都可以影响父对象。

2 个答案:

答案 0 :(得分:1)

对于观察者模式来说,这似乎是一个很好的例子,特别是如果孩子确实不需要父级的任何状态信息时。而且,如果父母想忽略孩子(不幸的是经常发生),您只需取消订阅该事件即可。

class Parent
{
  public Parent(Child child)
  {
    Child = child;
    Child.UpdateYourStatus += ComputeNewStateAndOutput;
  }

  Child Child {get; set;}

  private void ComputeNewStateAndOutput(sender, e) { ... }

  public void DisownChild()
  {
    //You are no longer my son (sigh, heard that one before)
    Child.UpdateYourStatus -= ComputeNewStateAndOutput;
  }
}

class Child
{
  public event EventHandler UpdateYourStatus;
}

答案 1 :(得分:-1)

您的两个选择在下面基本上是相同的,因此您可以随意选择自己喜欢的语法糖口味。在这两种情况下,都有某种类型的回调函数签名(在第一种情况下为类或接口,在第二种情况下为委托类型)和对象引用(在第一种情况下显式传递,或在委托实例中绑定)在第二种情况下。)

Microsoft确实对何时选择一个准则有一些指导:https://msdn.microsoft.com/library/2e759bdf-7ca4-4005-8597-af92edf6d8f0

通过回调选择对象引用/接口的一个很好的理由是,您知道您肯定会在父对象上调用多个回调。传递一个引用来实现定义所有这些回调的接口是有意义的,而不是必须创建一堆委托实例并将它们全部一起传递。

相反,如果您知道要为单个对象提供多种不同的回调实现,例如。因为您希望以完全不同的方式响应由不同子级调用的回调,所以使用函数指针/代理可能更有意义,但是无论哪种情况,您都不会强制选择一个选项在另一个之上。