2014-01-30 104 views
0

我是C#的新手,所以这可能只是我不了解某些基本的东西或错过了某些语言功能。我在网上搜索过,但是我似乎找到的所有例子在一个类中都有一切(换句话说,它们定义了事件以及事件触发时执行的方法),这不是我想要的。如何实现这种事件监听器设计?

对于我的场景,我想定义一个监听器方法的接口,它可以接受一些自定义参数(这将是我自己的EventArgs的权利?),它提供了说明。让我们假装它的一辆车,所以我有一个名为方法:

  • 开始(MyCustomParameters PAR)
  • 加速(MyCustomParameters PAR)
  • 减速(MyCustomParameters PAR)

,然后我想能够创建提供这些方法的实际实现的类。

完全与这一切分开,我有一个基于外部过程定期执行的类,我希望它负责触发这些事件(汽车启动和加速等)。

这是我努力工作的基础知识,但至今没有运气。另外还有一个后续问题。如果我的侦听器实现类需要维护给定调用中的任何一种状态,那么最好如何做到这一点(例如,说当加速被调用时,它希望能够将加速后的速度返回到调用器的调用者事件 - 例如80公里)

希望你能因此,帮助,我非常感谢你

+0

我认为你正在寻找依赖注入。您将需要实现类,一个类来管理实现的实例,然后需要一个处理实现的业务逻辑的监听器类。您需要确定接口方法的返回类型,以便您的处理程序/侦听器在触发时可以执行必要的操作。 –

+0

@Evan L我前几天实际上对DI进行了一些阅读,虽然看起来很酷,但对于像这样简单的事情,我只想让一个类触发事件,另一个类来处理它们似乎有点矫枉过正?是什么让你说DI在这里是必要的? – Grudge

回答

0

这里是事件/监听器在C#一个简单的例子:

//your custom parameters class 
    public class MyCustomParameters 
    { 
     //whatever you want here... 
    } 

    //the event trigger 
    public class EventTrigger 
    { 
     //declaration of the delegate type 
     public delegate void AccelerationDelegate(MyCustomParameters parameters); 

     //declaration of the event 
     public event AccelerationDelegate Accelerate; 

     //the method you call to trigger the event 
     private void OnAccelerate(MyCustomParameters parameters) 
     { 
      //actual triggering of the events 
      if (Accelerate != null) 
       Accelerate(parameters); 
     } 
    } 

    //the listener 
    public class Listener 
    { 
     public Listener(EventTrigger trigger) 
     { 
      //the long way to subscribe to the event (to understand you create a delegate) 
      trigger.Accelerate += new EventTrigger.AccelerationDelegate(trigger_Accelerate); 

      //a shorter way to subscribe to the event which is equivalent to the statement above 
      trigger.Accelerate += trigger_Accelerate; 
     } 

     void trigger_Accelerate(MyCustomParameters parameters) 
     { 
      //implement event handling here 
     } 
    } 

我希望它能帮助。

+0

谢谢你的回复。你的例子突出了我的困惑,但也帮助我理解我的想法。 OnAccelerate方法不是侦听器的实现,它只是触发事件的代码正确吗?我想我之前就把这两个混淆了。您是否必须将对EventTrigger的引用传递给侦听器?这似乎是一个奇怪的耦合......是它在C#中的工作原理? – Grudge

+0

是的,对OnAccelerate方法的调用触发事件。是的,你必须将对eventTrigger的引用传递给侦听器。但是,如果您不想处理EventTrigger的实例,则还可以将事件Accelerate声明为** static **并直接在该类上订阅该事件:** EventTrigger.Accelerate + = trigger_Accelerate; ** – nicolas1martin