Dot-Net

c# 中事件和委託的替代方法是什麼?

  • May 5, 2017

我最近在一次採訪中被問到如果我們沒有事件和委託,我們如何在沒有委託和事件的情況下實現發布者和訂閱者模型的相同功能。

你能用一個例子向我解釋一下,它會非常有幫助並且也會幫助其他人嗎?

訂閱者可以不使用委託,而是實現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可以有多個方法對應於多個“事件”。唯一的問題是,如果介面中有多個“事件”,訂閱者必須“訂閱”所有事件(必須有所有事件的方法)。因此,如果 中存在 anOnAdded和 anOnRemoved方法ISubscriber,則實現的類ISubscriber必須同時具有這兩種方法(顯然它們可能是什麼都不做的空存根)

我要補充一點,最後,委託可以通過具有單個方法的介面“模擬”,並且可以將事件視為List<somedelegatetype>,因此可以將事件視為List<ISomeInterface>。例如,Java 沒有委託,而是使用帶有單個方法的介面來代替它們(例如參見Java Delegates?

引用自:https://stackoverflow.com/questions/43800414