Entwickler-Ecke
C# - Die Sprache - Frage zu Event Möglichkeiten in der Sprache C Sharp
Felix2000 - Do 04.08.11 16:32
Titel: Frage zu Event Möglichkeiten in der Sprache C Sharp
Hi Folks !
Ich komme bisher aus der Java Welt und muss mich an sehr sehr viele Dinge in C Sharp erstmal gewöhnen und entsprechend umstellen.
Ich habe bisher einige kleine Anwendungen mithilfe der Windows Forms erstellt. Dort habe ich mittels der Objekte, die man aus der Toolbox auswählen kann einige kleinere Aufgaben gelöst. Mir ist dabei aufgefallen, dass man sehr komfortabel einige Events zu den jeweiligen Objekten benutzen kann.
Bei Java musste dazu erst ein entsprechendes Interface implementiert werden, diese Teilaufgaben fällt bei C Sharp ja weg. Nun habe ich aber mal folgende Frage an euch:
In Java konnte ich z.B. explizit mithilfe von Listener-Methoden bei der Eventprogrammierung die Quelle eines Events (z.B. bei Button) und einen Empfänger (z.B. eine separate Klasse, die von mir selbst geschrieben wurde) deklarieren. Das sah dann z.B. so aus:
Quelltext
1: 2:
| Button b = New Button(); Ereignisklasse eventclass = new EreignisKlasse(); |
//Jetzt erfolgt die Anmeldung der Ereignisklasse als Ereignisempfänger an dem Button, der die Quelle darstellt
Quelltext
1:
| b.addActionListener(eventclass); |
Hier konnte man also schön eigene Klassen für die Eventbehandlung implementieren. ich verstehe noch nicht ganz, wie das in C Sharp genau funktioniert. Habe ich dort evtl. auch die Möglichkeit, solche individuellen Codefragmente zu schreiben?
Danke schön für die Hilfestellungen !!
Greetz
Felix
Moderiert von
Th69: Code-Tags hinzugefügt
Ralf Jansen - Do 04.08.11 16:46
Das müsstest du dir selbst (mit etwas Reflektion zum herausfinden der Events) nach programmieren. Ich weiß aber auch nicht wofür man das braucht. In Java werden doch so letztlich alle Events einer Klasse durch eine Methode deiner Ereignisklasse gejagt oder? Hier dann wieder alles mit einem dicken Switch auseinander nehmen zu müssen find ich eher ungeschickt. Ist aber auch nur eine nicht Java Programmierer Meinung. Vielleicht entgeht mir gerade der Kick.
Yogu - Do 04.08.11 18:12
Wie
Ralf Jansen geschrieben hat, liegt die Stärke im C#-Ereignissystem darin, dass jedes Ereignis einzeln abonniert werden kann, und nicht gleich mehrere auf einmal mit einer Listener-Klasse. Wenn du dennoch eine Klasse schreiben willst, die ausschließlich Events behandeln soll, muss die einfach nur die Events abonnieren. Also im Prinzip so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| class MyEventListener { public MyEventListener(MyObject obj) { obj.Event1 += new EventHandler(obj_Event1); obj.Event2 += new EventHandler(obj_Event1); }
private void obj_Event1(object sender, EventArgs e) { }
private void obj_Event2(object sender, EventArgs e) { } } |
Felix2000 - Mo 08.08.11 09:38
Hi Folks !
Ralf Jansen hat folgendes geschrieben : |
| Das müsstest du dir selbst (mit etwas Reflektion zum herausfinden der Events) nach programmieren. Ich weiß aber auch nicht wofür man das braucht. In Java werden doch so letztlich alle Events einer Klasse durch eine Methode deiner Ereignisklasse gejagt oder? Hier dann wieder alles mit einem dicken Switch auseinander nehmen zu müssen find ich eher ungeschickt. Ist aber auch nur eine nicht Java Programmierer Meinung. Vielleicht entgeht mir gerade der Kick. |
Also die Ereignisklasse implementiert ein Interface, in dem alle Eventmethode enthalten sind und diese Eventmethode programmierst Du dann einfach nach Deinen Vorstellungen aus. Eine Alternative wäre das Ableiten von einer Adapterklasse (das ist in Java eine abstrakte Klasse mit konkreten Methoden) und dann programmierst Du in Deiner Ereignisklasse, die die Adapterklasse erweitert eben nur die Eventmethode aus, die Du wirklich brauchst. Nutzt Du die Variante mit einem Interface, dann musst Du alle Eventmethode implementieren (und selbst, wenn sie nur einen leeren Rumpf haben; die Methoden im Interface selbst sind implzit abstract).
Wie das jetzt so richtig in C# funktioniert, ist mir immernoch etwas schleierhaft.
Greetz
felix
Ralf Jansen - Mo 08.08.11 10:21
| Zitat: |
| Wie das jetzt so richtig in C# funktioniert, ist mir immernoch etwas schleierhaft. |
Wie gesagt einfach
C#-Quelltext
1:
| obj.Event += Instanz.MethodeMitZumEventPassenderSignatur; |
Wenn du das in einem von dir gewünschten Syntax möchtest dann zum Beispiel so wie von Yogu gezeigt. Wenn du es generischer möchtest dann eben per Reflection. Also in deiner dann in C# implementierten Ereignisklasse per Reflection die Events der übergebenen Klasse ermitteln und mit den in der Ereignisklasse implementierten EventHandlern vergleichen und passende Treffer dann verdrahten. Ich würde da wahrscheinlich Custom Attribute verwenden die die Methoden markieren für welchen Event sie den gedacht sind. Ich sehe da aber eigentlich keinen Grund zu. Konkrete Klassen habe konkrete klassenspezifische Events da kann man dann auch eine passende konkrete Eventhandlerklasse schreiben wenn man das denn will.
Felix2000 - Di 09.08.11 11:35
Hi Folks !
[quote="
Ralf Jansen"(647157
C#-Quelltext
1:
| obj.Event += Instanz.MethodeMitZumEventPassenderSignatur; |
[/quote]
Was genau bedeutet denn in diesem Code
obj.Event und das
+=
Sorry aber ich glaube, dass ich aufgrund meiner Java Vorkenntnisse vielleicht einfach zu kompliziert denke oder einfach falsch daran gehe.
Greetz
Felix
Yogu - Di 09.08.11 11:47
Felix2000 hat folgendes geschrieben : |
| Was genau bedeutet denn in diesem Code obj.Event und das += |
Event ist das Ereignis, dass in der Klasse von
obj deklariert wurde. Die Deklaration sieht in etwa so aus:
C#-Quelltext
1: 2: 3:
| class ClassOfObj { public event EventHandler Event; } |
Das bedeutet, dass die Klasse ein Ereignis namens
Event bereitstellt, das in diesem Fall eine Methode erwartet, die durch den
Delegate EventHandler definiert wird. Ein Delegate ist die Beschreibung eines Methodenkopfes und sieht so aus:
C#-Quelltext
1:
| delegate void EventHandler(object sender, EventArgs e); |
Du musst also eine Methode haben, die einen solchen Kopf hat, um sie dem Ereignis zuweisen zu können. Und das geht mit dem
+=-Operator. Bei Events ist es ein eigenständiger Operator, sonst kannst du
a += b zu
a = a + b erweitern. Er fügt also etwas hinzu, in diesem Fall einen Event-Handler zum Event. Wenn das Ereignis das nächste Mal ausgelöst wird, wird zusätzlich zu den bereits registrierten Event-Handlern der neu hinzugefügte aufgerufen. Ein Event kann also mehrere Event-Handler beliefern.
Ich hoffe, jetzt ist es dir etwas klarer.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!