Typ mit Events (Ereignissen) in fünf Schritten

  • Autor: H. Wiedow
  • Eingestellt:  27/08/2004

Das Ereignimodell der CLR basiert auf Delegate(s). Ein Delegate ist ein typsicheres Mittel, eine Rückrufmethode (Callback Method) aufzurufen. Wenn wir einen Typ entwerfen wollen, der ein Ereignis anbietet, sind hierzu fünf Schritte notwendig.

1. Wenn man zusätzliche Informationen, an den Empfänger des Ereignisses übermitteln möchten muss hierzu ein Typ definiert werden. Als Konvention ist im Net-Framework hierzu festgelegt, dass der Typ von System.EventArgs abgeleitet sein muss.

Beispiel für einen EventArgs-Typen:

	
					public class MailMsgEventArgs: EventArgs{					
							public readonly String from, to, subject, body;
							//Typ, der die Informatione definiert, die an
							// die Empfänger des Ereignisses geschickt werden.
							public MailMsgEventArgs(String from, String to,
							String subject, String body){
							this.from = from;
							this.to = to;
							this.subject = subject;
							this.body = body;
							}
												
					}				
				

2. Der Typ Delegate muss definiert werden. Dieser Typ legt fest, wie der Prototyp der Metode aussieht, dei beim Eintreten des Ereignisses aufgrufen wird: Als Konvention ist festgelegt, dass der Name des Delegate(s) auf EventHandler enden sollte. Außerdem sollte der Prototyp den Rückgabewert void und zwei Parameter haben. Der erste Parameter ist ein Object; er veiweist auf das Objekt, von dem die Benachrichtigung stammt. Der zweite Parameter it ein von EvnetArgs abgeleiteter Typ; er enthält alle zusätzlichen Informationen, die ein Empfänger der Benachrichtigung möglicherweise braucht.

Beispiel für einen Delegate-Typen:

						// 2. Der Delegate-Typ. Er definiert den Prototyp der
						//Rückrufmethode, die alle Empfänger implementieren müssen
						public delegate void MailMsgEventHandler(Object sender,	
						 MailMsgEventArgs args);				
					

3. Das Ereignis selbst. In meinem Beispiel lautet der Name des Ereignisses MailMsg. Dieses Ereignis hat den Typ MailMsgEventHandler (Delegate); daher müssen alle Empfänger der Ereignisbenachrichtigung eine Rückrufmethode bereitsellen, deren Prototyp (Signatur) dem des Delegates MailMsgEventHandler entspricht.

Beispiel für das Ereignis selbst:

						// 3. Das Ereignis selbst
						public event MailMsgEventHandler MailMsg;								
					

4. Eine geschütze virtuelle Methode definieren, die alle angemeldeten Empfängerobjekte über das Ereignis benachrichtigt: Wenn eine Nachricht eintrifft, wird die Mehode OnMailMsg aufgerufen. Diese Methode bekommt ein initialisertes MailMsgEventArgs-Objekt übergeben, das zusätzliche Informationen über das Ereignis enthält. Die Methode sollte erst prüfen, ob sich irgendwelche Objekte als Empfänger für das Ereignis angemeldet haben.

Beispiel für eine virtuelle Methode:

						// 4. Eine geschützte virtuelle Methode, die alle angemeldeten
						//Empfänger benachrichtigt, sobald das Ereignis auftritt
						protected vurtual void OnMailMsg(MailMsgEventArgs e){
						//Haben sich irgendwelche Objekte als Empfänger angemeldet?
						if(MailMsg != null){
						//Ja - alle Objekte die angemeldet sind benachrichtigen!
							MailMsg(this,e);	
						}	
						}										
					

5. Eine Methode erstellen, die die Eingaben in das gewünschte Ereignis umsetzt: Der Typ der das Ereignis bereitstellt, muss eine Methode besitzen, die Eingaben entgegennimmt und sie so umsetzt, dass sie ein Ereignis auslöst. In meinem Beispiel nenne ich sie SimulateArrivingMsg. Diese Methode nimmt die Informationen entgegen und initialisiert ein MailMsgEventArgs-Objekt. Anschließend wird die virtuelle Methode OnMailMsg des Typen aufgerufen.

Beispiel für eine Methode die das Ereignis auslöst:

						// 5. Eine Methode, die die Eingaben in das gewünschte Ereignis
						//umsetzt. Diese Methode wirf aufgerufen, wenn eine 
						//neue E-Mail eintrifft.
						public void SimulaeArrivingMsg(String from, String to,	
						String subject, String body){		
						//Objekt für die Informationen anlgen, die den Empfängern
						//der Benachrichtigung übergeben werden.
						MailMsgEventArgs e = new MailMsgEventArgs(from, to, subject, body);
						//Die virtuelle Methode aufrufen, um das Objekt darüber zu
						//informieren, dass das Ereignis aufgetreten ist. Falls
						//abgeleitete Typen diese Methode nicht überschreiben
						OnMailMsg(e);						
						}										
					

Sie sehen, es ist nicht sehr Aufwendig einen Typen der Events (Ereignisse)anbietet zu erstellen. Weitere Artikel zum Thema Events in C# werde ich demnächst anbieten. Vorgestellt habe ich mir:

  • Typen mit serialisierbaren Events
  • Typen mit vielen Events (EventHandlerSet)
 
 

Resoursen zum Thema:

  • Wer sich den Code des Typen, sowie den eines Typen der das Ereignis aboniert hat ansehen möchte, kann den
    Quellcode downloaden
  • Auführlichere Informationen über das Event-System in C# finden Sie unter:
    Galileo Openbook