2014-01-30 1 views
0

저는 C#을 처음 접했기 때문에 언어의 일부 기능을 이해하지 못하거나 뭔가를 이해하지 못했습니다. 나는 온라인에서 검색을했는데, 모든 예제는 하나의 클래스에서 모든 것을 찾았다. (즉, 이벤트가 트리거 될 때 실행되는 메서드뿐만 아니라 이벤트도 정의한다.) 이것은 내가 원하는 것이 아니다.이러한 종류의 이벤트 수신기 디자인은 어떻게 구현합니까?

제 시나리오의 경우 사용자 지정 매개 변수를 수락 할 수있는 수신기 메서드 인터페이스를 정의하고 싶습니다.이 메서드는 지침을 제공하는 자체 EventArgs가 될 수 있습니다. 차를 그 척 수 있습니다, 그래서이라는 방법이 있습니다

  • 시작 (MyCustomParameters 파)
  • 이 (MyCustomParameters 파)를 가속화
  • 로 감속 (MyCustomParameters 파)를 내가 원하는

및 이러한 메소드의 실제 구현을 제공하는 클래스를 작성할 수 있습니다.

이 모든 것과는 완전히 별개로, 외부 프로세스를 기반으로 주기적으로 실행되는 단일 클래스가 있으며이 이벤트를 트리거해야합니다 (자동차가 시동을 걸고 가속 할 때 등).

그것은 내가 일하려고 노력하고있는 것의 기초 다. 그러나 지금까지 운이 없다. 또한 한 가지 후속 질문입니다. 내 청취자 구현 클래스가 주어진 호출로부터 어떤 종류의 상태를 유지할 필요가 있다면 그것을 어떻게하면 좋을까요 (예를 들어, Accelerate가 호출 될 때 호출 된 속도를 호출자에게 되돌릴 수 있기를 원한다고 말하면됩니다).

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

나는 그것이 도움이되기를 바랍니다 : - 이벤트 등 80 킬로미터)

여기

+0

당신은 의존성 주입을 찾고 있다고 생각합니다. 구현 클래스, 구현의 인스턴스화를 관리하는 클래스, 구현의 비즈니스 로직을 처리하는 리스너 클래스가 필요합니다. 핸들러/리스너가 트리거 될 때 필요한 조치를 수행 할 수 있도록 인터페이스 메소드의 리턴 유형을 판별해야합니다. –

+0

@Evan L 다른 요일에 DI에서 실제로 독서를 한 적이 있습니다. 멋지게 보이지만, 한 클래스에서 이벤트를 트리거하고 다른 이벤트에서 이벤트를 처리하기를 원한다면 이런 식으로 간단한 것입니다. 여기서 DI가 필요하다고 말하는 이유는 무엇입니까? – Grudge

답변

0

는 C#에서 이벤트/청취자의 간단한 예입니다 대단히 감사합니다, 당신이 그렇게 도움이 될 수 있기를 바랍니다.

+0

답장을 보내 주셔서 감사합니다. 당신의 모범은 내 혼란을 강조하고 또한 내가 생각하는 것을 이해하도록 도와줍니다. OnAccelerate 메서드는 리스너의 구현이 아니라 이벤트를 트리거하는 코드 일뿐입니다. 나는 그 두 가지를 혼란스럽게 생각했다. EventTrigger에 대한 참조를 리스너에게 전달해야합니까? 이상한 커플 링처럼 보입니다 ... C#에서 작동하는 방식일까요? – Grudge

+0

예, OnAccelerate 메서드를 호출하면 이벤트가 트리거됩니다. 그리고 네, eventTrigger에 대한 참조를 리스너 (들)에게 전달해야합니다. 그러나 EventTrigger의 인스턴스를 처리하고 싶지 않은 경우 Accelerate 이벤트를 ** static **으로 선언하고 클래스의 이벤트에 직접 등록 할 수도 있습니다. ** EventTrigger.Accelerate + = trigger_Accelerate; ** – nicolas1martin

관련 문제