簡體   English   中英

C#使用接口訂閱事件

[英]C# Subscribing to Events Using Interfaces

我最近開始使用C#事件,並且我真的很喜歡它們提供的易用性(我來自Java背景,我們必須手動完成所有這些事件工作)。

但是,從我的java背景中我缺少一件事:繼承方面。

在Java中,如果要預訂事件,則可以繼承IKeyListener之類的接口。 接口將包含所有方法事件簽名,然后您將在訂閱類中實現該方法簽名。 每當按鍵被按下時,這些已實現的方法就會被觸發。 與C#大致相同。 但是,與Java不同,我無法確定哪些類訂閱了某些事件,因為它們實際上沒有繼承任何東西。

因此,如果我想要一個具有按鍵事件支持的對象列表,我可以

List<IKeyListener> keyListeners = new ArrayList<IKeyListener>();

但是,我在C#中看不到任何好的方法。 我將如何創建類似於上面的列表? 最好沒有太多的“ hackackiness”。

謝謝。

在C#中,您可以在這樣的接口中定義事件:

public interface IDrawingObject  
{  
    event EventHandler ShapeChanged;  
} 

然后,您可以執行所需的操作並像這樣存儲它們:

var shapes = new List<IDrawingObject>();

然后,一個類可以實現如下接口:

public class Shape : IDrawingObject  
{  
    public event EventHandler ShapeChanged;  
    void ChangeShape()  
    {  
        // Do something here before the event…  

        OnShapeChanged(new MyEventArgs(/*arguments*/));  

        // or do something here after the event.   
    }  
    protected virtual void OnShapeChanged(MyEventArgs e)  
    {  
        if(ShapeChanged != null)  
        {  
           ShapeChanged(this, e);  
        }  
    }  
} 

因此,換句話說,事件成為接口的一部分,如果類實現該接口,則該類也必須提供事件的實現。 這樣,您可以安全地假設實現類具有事件。

最后,每個事件都需要共享一些有關事件的信息。 該類可以繼承EventArgs類,如下所示:

public class MyEventArgs : EventArgs   
{  
    // class members  
}  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM