C#使用接口订阅事件

时间:2017-05-22 23:40:29

标签: c# events interface event-handling

我最近开始使用C#活动,我真的很喜欢它们提供的易用性(我来自java背景,我们必须手动完成所有这些事件)。

但是,我的java背景中有一件事我缺少:继承方。

在java中,如果要订阅事件,则可以继承IKeyListener等接口。该接口将包含您将在订阅类中实现的所有方法事件签名。只要按下某个键,就会触发这些实现的方法。与C#大致相同。但是,与java不同,我无法识别哪些类订阅某些事件,因为它们实际上并没有继承任何事件。

因此,如果我想要一个具有关键新闻事件支持的对象列表,我可以做到

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

但是,我认为在C#中没有任何好的方法。我怎样才能创建类似于上面的列表?最好没有太多“hackiness”。

谢谢。

1 个答案:

答案 0 :(得分:2)

在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  
}