.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?) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |