我最近开始使用C#活动,我真的很喜欢它们提供的易用性(我来自java背景,我们必须手动完成所有这些事件)。
但是,我的java背景中有一件事我缺少:继承方。
在java中,如果要订阅事件,则可以继承IKeyListener等接口。该接口将包含您将在订阅类中实现的所有方法事件签名。只要按下某个键,就会触发这些实现的方法。与C#大致相同。但是,与java不同,我无法识别哪些类订阅某些事件,因为它们实际上并没有继承任何事件。
因此,如果我想要一个具有关键新闻事件支持的对象列表,我可以做到
List<IKeyListener> keyListeners = new ArrayList<IKeyListener>();
但是,我认为在C#中没有任何好的方法。我怎样才能创建类似于上面的列表?最好没有太多“hackiness”。
谢谢。
答案 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
}