2014-01-30 177 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