在c#中,事件和委托的替代方法是什么?

拉胡尔·沙玛(Rahul Sharma)

最近有人在采访中问我,例如我们是否没有事件和委托,而没有委托和事件,我们如何才能实现Publisher和Subsriber模型的相同功能。

您能举个例子给我解释一下,这将确实有帮助,也将对他人有帮助?

Xanatos

订阅者可以使用ISubscriber具有方法的接口而不是使用委托,SomeEvent而将自身传递给发布者(传递给具有签名的方法Subscribe(ISubscriber subscriber))。然后,发布者会将此引用存储到订阅者,并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可以具有对应于多个“事件”的多种方法。唯一的问题是,如果接口中有多个“事件”,则订阅者必须“订阅”所有事件(必须具有所有事件的方法)。因此,如果中有OnAddedOnRemoved方法ISubscriber,则实现的类ISubscriber必须同时具有这两种方法(显然,它们可以是不执行任何操作的空存根)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C#设置的替代方法是什么

在C#中订阅(+ =)和取消订阅(-=)委托的复杂性是什么?

C#中的委托()方法的确切含义是什么?

有关C#中的事件和委托的说明

C#中Java Keys.chord()方法的替代方法是什么?

在C#中,HttpClient.getStringAsync()方法的同步替代项是什么?

使用C#在.NET 4.0中替代Task.Run的方法是什么?

在C#中委托的内容是什么?

API 21和22中setTorchMode的替代方法是什么

C 中 switch-case 语句的替代方法是什么?

触摸事件的MotionX和motionY替代品是什么?

C#中的“静态方法”是什么?

NativeScript中DIV的替代方法是什么?

Ruby中eval的替代方法是什么?

在C#中,将EventHandler类型的var等同于委托是什么意思?

ef core3中HasForeignKey和ForSqlServerUseSequenceHiLo方法的替代方法是什么?

hibernate 中的聚合、委托和关联是什么?

C#中允许重复键的Dictionary的替代方法是什么?

使用 JavaScript 的事件委托设置删除事件侦听器的有效方法是什么

在 C# 中,按时间字符串解析和排序的最佳方法是什么?

C#中数组的不可变替代品是什么?

pyspark 1.6中的熊猫分位数和剪切的替代方法是什么

在Firefox和IE中-webkit-print-color-adjust的替代方法是什么

ZeroMQ中的锁和关键部分的替代方法是什么(指南)

在本地C ++和Java程序之间进行通信的好的替代方法是什么?

Swift中这些NSURLSession方法的委托是什么?

连接C#和Java的最佳方法是什么?

在数组中查找事件 x 和事件 y 的最佳方法是什么?

为什么我们要指定一个委托和一个事件,为什么不只在C#中使用一个事件呢?