Skip to content

Commit 962d21f

Browse files
committed
Merge branch 'master' of github.com:TUBAF-IfI-LiaScript/VL_Softwareentwicklung
2 parents 09df0d2 + effe2a5 commit 962d21f

2 files changed

Lines changed: 22 additions & 13 deletions

File tree

22_Events.md

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ C# etabliert für die Nutzung der Pub-Sub Kommunikation *Events*. Dies sind spez
183183
{{0-1}}
184184
********************************************************************************
185185

186-
Der Publisher ist eine Klasse, die ein Delegaten enthält. Der Publisher entscheidet damit darüber, wann Nachrichten versandt werden.
186+
Der Publisher ist eine Klasse, die eine Delegate-Variable enthält. Der Publisher entscheidet damit darüber, wann Nachrichten versandt werden.
187187
Auf der anderen Seite finden sich die Subscriber-Methoden, die ausgehend vom aktivierten Delegaten im Publisher zur Ausführung kommen. Ein Subscriber hat keine Kenntnis von anderen Subscribern. Events sind ein Feature aus C# dass dieses Pattern formalisiert.
188188

189189
> Merke: Ein Event ist ein Klassenmember, dass die Features des Delegatenkonzepts nutzt, um eine Publisher-Subscribe Interaktion zu realisieren.
@@ -205,7 +205,7 @@ public class Publisher{
205205

206206
// Schritt 3
207207
// Wir implementieren das "Feuern" des Events
208-
public magicMethod(){
208+
public void magicMethod(){
209209
if (oldA != newA) OnAChangedHandler();
210210
}
211211
}
@@ -214,7 +214,7 @@ public class Publisher{
214214
// Implementieren des Subscribers - in diesem Fall wurde eine separate Klasse
215215
// gewählt.
216216
public class Subscriber{
217-
public static void m_OnPropertyChanged(){
217+
public void m_OnPropertyChanged(){
218218
Console.WriteLine("A was changed!");
219219
}
220220
}
@@ -225,6 +225,7 @@ public static void Main(string[] args){
225225
Publisher myPub = new Publisher();
226226
Subscriber mySub = new Subscriber();
227227
myPub.OnAChangedHandler += new varAChangedHandler(mySub.m_OnPropertyChanged);
228+
myPub.magicMethod();
228229
}
229230
```
230231

@@ -234,7 +235,7 @@ Welche Konsequenzen ergeben sich daraus?
234235

235236
+ Es ist eine 1:n Relation. Ein Ereignis entstammt einem Publisher, kann aber mehrere Subscriber adressieren.
236237

237-
+ Ereignisse, die keine Subscriber haben, werden nie ausgelöst. Das bedeutet, dass ein Publisher die Subscriber kennen muss.
238+
+ Achtung: Ereignisse, die keine Subscriber haben werfen NullReferenzException aus, wenn sie ausgelöst werden (OnAChangedHandler?.Invoke();).
238239

239240
+ Ereignisse werden in der Regel verwendet, um Benutzeraktionen wie Mausklicks oder Menüauswahlen in GUI-Schnittstellen zu signalisieren.
240241

@@ -268,7 +269,7 @@ public event VarAChangedHandler AChanged
268269
}
269270
```
270271

271-
2. Der Compiler sucht innerhalb der Publisher Klasse nach Referenzen, die auf AChanged und lenkt diese auf das private Delegate um.
272+
2. Der Compiler sucht innerhalb der Publisher Klasse nach Referenzen auf AChanged und lenkt diese auf das private Delegate um.
272273
3. Der Compiler mappt alle += Operationen außerhalb auf die Zugriffsmethoden add and remove.
273274

274275
********************************************************************************
@@ -372,14 +373,22 @@ class Program {
372373
**Ja, aber ... ** Was unterscheidet eine Delegate von einem Event? Was würde passieren, wenn wir
373374
das Key-Wort aus dem Code entfernen?
374375

375-
Die Implementierung wäre nicht so robust, da folgende Möglichkeiten offen ständen:
376+
Die Implementierung wäre nicht so robust, da folgende Möglichkeiten offen ständen und damit :
376377

377378
| Eingriff | Bedeutung | Verhindert |
378379
| --------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ---------- |
379380
| `GoogleStock.OnPropertyPriceChanged = null;` | Löscht alle Callback-Handler | ja |
380381
| `GoogleStock.OnPropertyPriceChanged = DelPriceChangedHandler(MailService.stock_OnPropertyChanged);` | Setzt einen einzigen Handler (und löscht alle anderen) | ja |
381382
| `GoogleStock.OnPropertyPriceChanged.Invoke();` | Auslösen des Events innerhalb eines Subscribers | ja |
382383

384+
Das Weglassen des Schlüsselwortes event untergräbt das Prinzip der Kapselung und führt leicht zu unbeabsichtigtem Verhalten wie z. B. doppelte Aufrufe.
385+
386+
Das event-Keyword dient als Zugriffsmodifizierer für Delegaten und stellt sicher, dass:
387+
388+
- Nur der Publisher das Event auslösen kann,
389+
390+
- Externe Objekte keinen direkten Zugriff auf den Delegaten selbst bekommen.
391+
383392
Was fehlt Ihnen an der Implementierung?
384393

385394
Richtig, die Möglichkeit auf die Daten zurückzugreifen.

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222
| 9 | 26. Mai | UML Konzepte |gemeinsam |
2323
| | 30. Mai | UML Diagrammtypen |gemeinsam |
2424
| 10 | 2. Juni | UML Anwendungsbeispiel |gemeinsam |
25-
| | 6. Juni | Testen | |
25+
| | 6. Juni | Dokumentation und Build Toolchains | |
2626
| 11 | 9. Juni | _Pfingstmontag_ | _Pfingstmontag_ |
27-
| | 13. Juni | Dokumentation und Build Toolchains | |
28-
| 12 | 16. Juni | Continuous Integration in GitHub | |
29-
| | 20. Juni | Delegaten | |
30-
| 13 | 23. Juni | Events | |
31-
| | 27. Juni | Threadkonzepte in C# | |
32-
| 14 | 30. Juni | Taskmodell | |
27+
| | 13. Juni | Delegaten | |
28+
| 12 | 16. Juni | Events | |
29+
| | 20. Juni | Threadkonzepte in C# | |
30+
| 13 | 23. Juni | Taskmodell | |
31+
| | 27. Juni | Testen | |
32+
| 14 | 30. Juni | Continuous Integration in GitHub | |
3333
| | 4. Juli | Design Pattern | |
3434
| 15 | 7. Juli | Language Integrated Query | |
3535
| | 11. Juli | GUI - MAUI | |

0 commit comments

Comments
 (0)