Verständnisfragen zu Events


Saheeda

Mitglied
Hallo,

ich beziehe mich auf diesen Artikel.

Ich brauche also auf Senderseite:
- ein Event, das ich auslösen möchte
- einen delegate gleichen Typs , der die Signatur des Events vorgibt

und auf Empfängerseite:
- eine Funktion mit der Signatur des Events, auf welches reagiert werden soll.

Soweit richtig?

Wenn ich das richtig verstehe, dann sage ich mit
event += new EventHandler(receiver.getData), wer auf das Event reagieren soll, wenn es ausgelöst wird.

Mir ist nur noch nicht so ganz klar, warum der Sender wissen muss, wer auf seine Events reagieren soll. Ich finde das ehrlich gesagt n bisschen unflexibel. Wenn ich jetzt neue Listener implementiere, muss ich jedes Mal wieder in die Senderklasse gehen und dem sagen, dass er noch jemanden benachrichtigen muss.
Kann ich das Event nicht auch einfach so in den Raum schmeißen und die jeweiligen Objekte schauen selbst, ob es sie betrifft, oder nicht?
Wenn ja, wie müsste ich das bauen?

Vielen Dank!
 

sheel

I love Asm
Hi

das Problem ist, dass der Listener eine "ganz normale" Methode ist, wie jeder Nicht-Listener.
Der Computer kann von allein nicht wissen, welche Methoden als Eventempfänger gedacht sind.

Und einfach jede passende Methode aufrufen geht natürlich nicht, weil dann jedes Mal
jeder nicht gemeinte Listener mit aufgerufen wird und irgendwas macht, was grad gar nicht passt
(und außerdem, was ist "jede" Methode? Da müsste man jede Programmdatei am Computer
durchsuchen, weil das eigene Programm ja auch externe DLLs usw. verwenden kann)

Natürlich könnten die Listener filtern, welche Events (von welchem Erzeuger) sie bearbeiten wollen,
aber das ist das das Gleiche nur umgekehrt: Zurzeit suchen sich ja die Erzeuger die Listener aus,
wenn sich die Listener die Erzeuger aussuchen wäre das keine Vereinfachung.
 

Saheeda

Mitglied
Hallo sheel,

in z.B. JavaScript kann ich Events so schreiben:

Javascript:
Listener:
$scope.$on("myEvent", function(){...});

Sender:
$scope.$emit("myEvent");

oder:

Listener:
myObject.graphics.addEventListener("myEvent", function(){...});

Sender:
myObject.dispatchEvent("myEvent");
Deswegen dachte ich, dass es in C# vielleicht etwas Ähnliches gibt. Schade, aber danke für deine Antwort.
 

sheel

I love Asm
Und wie ist das anders?

Hier im JS-Code musst du eben angeben, für welches HTML-Element ($scope)
und für welches Ereignis (myEvent) welche Funktion ausgelöst wird.

Im C#-Beispiel musst du die selben Sachen angeben.

Einfach eine Funktion machen, die selber weiß wo sie dazugehört, geht in beiden Sprachen nicht.
 

Saheeda

Mitglied
Hallo,

$scope bezieht sich in dem Fall nicht auf ein bestimmtes Element, sondern den globalen Scope.

Im realen Leben würde ich das glaube ich so beschreiben:
JS: Sender hält ne Flagge hoch, ohne zu wissen, wer wo wann wie reagiert
C#: Sender ruft A an, dass es mit X reagieren soll

Meines Erachtens sind das schon verschieden Arten der Implementierung, aber kann auch sein, dass ich irgendwo was komplett falsch verstanden habe.
 

sheel

I love Asm
$scope bezieht sich in dem Fall nicht auf ein bestimmtes Element, sondern den globalen Scope.
Dann ist es eben nicht "ein HTML-Element", sondern "viele HTML-Elemente".
Trotzdem ist es eine Angabe, wo die Funktion dazugehört,
es gibt nur eine überschaubare Anzahl von HTML-Elementen auf einer Seite.

Und anders als auf eines Webseite gibts in "echten " Programmen keinen abgegrenzten globalen Scope
(bzw. den gibts schon, aber der ist unendlich groß: Das C#-Programm kann ja beliebige DLLs verwenden,
von denen es zum Zeitpunkt der Handlererzeugung noch nichts wissen muss.)

JS: Sender hält ne Flagge hoch, ohne zu wissen, wer wo wann wie reagiert
C#: Sender ruft A an, dass es mit X reagieren soll
Naja, eben nicht. Bei JS hast du jedem HTML-Element gesagt,
dass es da eine Funktion gibt, die es zu bestimmten Zeitpunkte aufrufen soll,

Was es in C# nicht von selber gibt, in JS aber schon, sind eben so Zusammenfassungen
mit denen man mehrere Objekte in der selben Zeile ansprechen kann. Man müsste selber
jedes dieser Objekte in ein Array/Liste/etc. tun, bevor sowas geht. Grund wieder wie oben:
Bei C# gibts theoretisch nur einen unendlichen "Raum", mit unendlich vielen Objekten.
Und was zB. alles zu deiner GUI gehört ist nicht irgendwo für Listenerzuweisungen abfragbar,
außer du listest es selber auf.
 
Zuletzt bearbeitet: