加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.net – c#中的事件和代理的替代方法是什么?

发布时间:2020-12-15 23:39:04 所属栏目:百科 来源:网络整理
导读:我最近在一次采访中被问到,如果我们没有事件和代表,我们如何在没有代表和事件的情况下实现Publisher和Subsriber模型的相同功能. 你能用一个例子向我解释一下它会非常有用并且也能帮助别人吗? 解决方法 订户可以实现具有SomeEvent方法的接口ISubscriber,而不
我最近在一次采访中被问到,如果我们没有事件和代表,我们如何在没有代表和事件的情况下实现Publisher和Subsriber模型的相同功能.

你能用一个例子向我解释一下它会非常有用并且也能帮助别人吗?

解决方法

订户可以实现具有SomeEvent方法的接口ISubscriber,而不是使用委托,并将其自身传递给发布者(具有签名订阅(ISubscriber订户)的方法).然后,发布者将此引用存储到订阅者,并在必要时调用subscriber.SomeEvent.

就像是:

public interface ISubscriber
{
    void SomeEvent(object publisher,object data);
}

public class SomePublisher
{
    private readonly HashSet<ISubscriber> subscribers = new HashSet<ISubscriber>();

    public void Subscribe(ISubscriber subscriber)
    {
        subscribers.Add(subscriber);
    }

    public void Unsubscribe(ISubscriber subscriber)
    {
        subscribers.Remove(subscriber);
    }

    public void DoSomething()
    {
        // Do something

        // Then

        foreach (var subscriber in subscribers)
        {
            object data = "Some data";
            subscriber.SomeEvent(this,data);
        }
    }
}

请注意,此发布者/订阅者模型不限于单个“事件”:ISubscriber可能有多个方法对应多个“事件”.唯一的问题是,如果接口中有多个“事件”,则订户必须“订阅”所有事件(必须具有所有事件的方法).因此,如果ISubscriber中有OnAdded和OnRemoved方法,则实现ISubscriber的类必须具有这两种方法(显然它们可能是无效的空存根)

我将补充说,最后,代理可以通过具有单个方法的接口“模拟”,并且事件可以被认为是List< somedelegatetype>,因此事件可以被认为是List< ISomeInterface>.例如,Java没有委托,并使用单个方法代替它们的接口(参见例如Java Delegates?)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读