Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用接口订阅事件_C#_Events_Interface_Event Handling - Fatal编程技术网

C#使用接口订阅事件

C#使用接口订阅事件,c#,events,interface,event-handling,C#,Events,Interface,Event Handling,我最近开始使用C#events,我非常喜欢它们提供的易用性(我来自java背景,我们必须手动完成所有这些事件) 然而,在我的java背景中,有一点我还没有找到:继承方面 在java中,如果您想要订阅事件,您将继承一个接口,如IKeyListener。接口将包含所有方法事件签名,然后在订阅类中实现这些签名。只要按下一个键,就会触发这些实现的方法。与C#大致相同。但是,与java不同,我无法确定哪些类订阅了某些事件,因为它们实际上没有继承任何内容 所以如果我想要一个包含按键事件支持的对象列表,我可以

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

然而,在我的java背景中,有一点我还没有找到:继承方面

在java中,如果您想要订阅事件,您将继承一个接口,如IKeyListener。接口将包含所有方法事件签名,然后在订阅类中实现这些签名。只要按下一个键,就会触发这些实现的方法。与C#大致相同。但是,与java不同,我无法确定哪些类订阅了某些事件,因为它们实际上没有继承任何内容

所以如果我想要一个包含按键事件支持的对象列表,我可以这样做

List<IKeyListener> keyListeners = new ArrayList<IKeyListener>();
List keylisters=new ArrayList();
然而,在C#中,我看不到任何好的方法来实现这一点。我如何才能创建类似于上述列表的列表?最好不要太“刻薄”

谢谢。

在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);  
        }  
    }  
} 
然后你可以做你想做的事情并像这样存储它们:

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  
}  
在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);  
        }  
    }  
} 
然后你可以做你想做的事情并像这样存储它们:

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  
}  

当您在问题中提到Java时,问题本身并不是关于创建Java程序,因此问号是不合适的。当你在问题中提到Java时,问题本身并不是关于创建Java程序的,因此问号是不合适的。我已经帮你删除了。这接近我要找的。但是如果我不想让Shape类成为“激发”事件的类呢?我想让一个类调用事件,然后让另一个类订阅正在调用的事件。假设我有一个Blueprint类,它需要知道某个形状何时更改(并且该形状不是Blueprint的成员)。我怎样才能做到这一点,而不必也是调用事件的类?也有可能我完全错过了什么。如果是,请让我知道,谢谢:)但你为什么要这样做?整个想法是让全班学生掌握这些知识,而不是其他人。如果我有一个带有单击事件的按钮,我只希望该按钮表示它已单击。我不想让其他类说它被点击了,因为如果它没有被点击呢。@exonto如果你想让
blueprint
类知道
shape
何时改变,那么
blueprint
可以订阅
shape
类的
change
事件。但是只有
shape
应该触发事件。应该何时触发此事件的所有代码都应该在
shape
类中。现在我认真思考了一下,这实际上归结为以下内容。我想有一些方法来要求类订阅事件。我的想法是,接口需要实现它们的方法,然后可以以某种方式使用这些方法来要求它订阅。我想我只是使用列表示例,因为这是我以前做过的事情。但我明白你的意思,因为我会破坏目的。话虽如此,请允许我重新表述我的问题。如何确保一个类订阅了一个事件?在我的示例中,shape类有以下代码
if(ShapeChanged!=null)
,这基本上意味着如果有人订阅了,则通知他们。这就是你现在要问的吗?这和我要找的差不多。但是如果我不想让Shape类成为“激发”事件的类呢?我想让一个类调用事件,然后让另一个类订阅正在调用的事件。假设我有一个Blueprint类,它需要知道某个形状何时更改(并且该形状不是Blueprint的成员)。我怎样才能做到这一点,而不必也是调用事件的类?也有可能我完全错过了什么。如果是,请让我知道,谢谢:)但你为什么要这样做?整个想法是让全班学生掌握这些知识,而不是其他人。如果我有一个带有单击事件的按钮,我只希望该按钮表示它已单击。我不想让其他类说它被点击了,因为如果它没有被点击呢。@exonto如果你想让
blueprint
类知道
shape
何时改变,那么
blueprint
可以订阅
shape
类的
change
事件。但是只有
shape
应该触发事件。应该何时触发此事件的所有代码都应该在
shape
类中。现在我认真思考了一下,这实际上归结为以下内容。我想有一些方法来要求类订阅事件。我的想法是,接口需要实现它们的方法,然后可以以某种方式使用这些方法来要求它订阅。我想我只是使用列表示例,因为这是我以前做过的事情。但我明白你的意思,因为我会破坏目的。话虽如此,请允许我重新表述我的问题。如何确保类是subscribe