![](/img/trans.png)
[英]C# Events / Interfaces - Getting Callbacks without subscribing in every class that's using the interface
[英]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.