gpt4 book ai didi

c# - 使用事件数组的委托(delegate)和事件的观察者模式

转载 作者:行者123 更新时间:2023-11-30 19:32:12 25 4
gpt4 key购买 nike

我们有一个类管理许多存储数据的队列。当新数据添加到每个队列时,我希望用户得到通知。我想通过委托(delegate)和事件来使用观察者模式。通常对于单个事件和源,我们会这样做:

public delegate void NewDataAddedDelegate();
public event NewDataAddedDelegate NewDataAdded;

对于观察者:

qManager.NewDataAdded += new qManager.NewDataAddedDelegate(getNewDataFunc);

但是在这种情况下,我们有,比方说,10个队列,每个队列可以任意接收数据。所以我们希望观察者函数订阅一个单独的队列。我们认为我们可以做到:

public delegate void NewDataAddedDelegate();
public event NewDataAddedDelegate [] NewDataAdded; // can't do this

在qManager的构造函数中:

NewDataAdded = new NewDataAddedDelegate[numberOfQueues];

在观察者中:

qManager.NewDataAdded[0] += new qManager.NewDataAddedDelegate(getNewDataFunc0);
qManager.NewDataAdded[1] += new qManager.NewDataAddedDelegate(getNewDataFunc1);

但不行,因为事件应该是委托(delegate)类型,而不是委托(delegate)类型数组。

关于如何解决这个问题有什么想法吗?

最佳答案

不,事件不是那样进行的。选项:

  • 创建另一个公开事件的类型,并拥有该类型的数组或集合:

    // Preferably *don't* just expose an array...
    public TypeWithEvent[] Queues { get { ... } }

    // Subscription:
    qManager.Queues[i].NewDataAdded += ...
  • 或者,不使用事件,只使用方法:

    private NewDataAddededDelegate[] newDataAdded;

    public void SubscribeNewDataAddedHandler(int queue,
    NewDataAddedDelegate handler)
    {
    newDataAdded[queue] += handler;
    }

    // Subscription
    qManager.SubscribeNewDataAddedHandler(0, ...);

虽然我个人认为每个队列实际上应该是它自己的对象...使队列管理器公开队列集合,每个队列都可以单独订阅。 (即采用第一种方法。)否则您的队列管理器确实做了太多工作。

关于c# - 使用事件数组的委托(delegate)和事件的观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5831228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com