Autor Beitrag
Felix2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: Do 04.08.11 16:32 
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:

ausblenden 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

ausblenden 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 user profile iconTh69: Code-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 04.08.11 18:12 
Wie user profile iconRalf 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: Mo 08.08.11 09:38 
Hi Folks !

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 08.08.11 10:21 
Zitat:
Wie das jetzt so richtig in C# funktioniert, ist mir immernoch etwas schleierhaft.


Wie gesagt einfach

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: Di 09.08.11 11:35 
Hi Folks !

[quote="user profile iconRalf Jansen"(647157
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 09.08.11 11:47 
user profile iconFelix2000 hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden 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:

ausblenden 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.