Skip to content
Snippets Groups Projects
Commit 3b5c45a2 authored by Uwe Wienkop's avatar Uwe Wienkop
Browse files

2021-06-07 Delegate-Verkettung, datengetriebene Programmierung

parent f49e6a26
No related branches found
No related tags found
No related merge requests found
Showing with 250 additions and 5 deletions
......@@ -7,15 +7,21 @@ namespace _10_1_DelegateVariable
delegate void MyFunction(string s);
class Button
{
public /*event*/ MyFunction Callback;
public event MyFunction Callback;
// event ~ Einschränkung der Zugriffsmöglichkeiten von
// außerhalb der Klasse auf nur noch += bzw. -=
public void Print(string s)
{
Callback?.Invoke(s);
// Vorarbeiten
// Callback(s);
Callback?.Invoke(s); // ?. ~ (Callback==null) ? null : Callback.Invoke(s)
// print = null; ~ Nur innerhalb der Klasse erlaubt
// Nacharbeiten
}
// Console.WriteLine(s);
// AusgabeInGrossbuchstaben(s);
// :
}
}
......@@ -21,7 +21,7 @@ namespace _10_1_DelegateVariable
t1.Callback += Console.WriteLine;
t1.Callback += AusgabeInGrossbuchstaben;
t1.Callback = AusgabeInKleinbuchstaben;
t1.Callback += AusgabeInKleinbuchstaben;
t1.Callback += delegate (string s) { Console.WriteLine($"*** {s} ***"); };
t1.Callback += s => { Console.WriteLine($"--- {s} ---"); };
//t1.print -= AusgabeInGrossbuchstaben;
......@@ -31,6 +31,7 @@ namespace _10_1_DelegateVariable
// Anonyme Methoden & Lambda-Ausdrücke können nicht aus der Liste entfernt werden!
t1.Print("Hallo");
// t1.Callback("Hallo"); //~ Direkter Aufruf der Delegate-Var ist bei event nicht erlaubt
// t2.print += t1.print; Ebenfalls nicht erlaubt
//t2.Print("Welt");
......
......@@ -7,7 +7,9 @@
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Button Content="Mein Button" HorizontalAlignment="Left" Margin="117,91,0,0" VerticalAlignment="Top" Click="Button_Click"/>
<Button x:Name="btnMeinKlickButton" Content="Klick!" HorizontalAlignment="Left" Margin="117,91,0,0" VerticalAlignment="Top" Click="Button_Click"/>
<Label x:Name="LblCount" Content="" HorizontalAlignment="Left" Height="32" Margin="117,158,0,0" VerticalAlignment="Top" Width="247"/>
<Button x:Name="DoppelklickButton" Content="Mein Doppelklick Button" HorizontalAlignment="Left" Margin="439,64,0,0" VerticalAlignment="Top" MouseDoubleClick="MeineDoppelklickMethode"/>
</Grid>
</Window>
......@@ -20,6 +20,7 @@ namespace _10_3_WpfButton
/// </summary>
public partial class MainWindow : Window
{
int count = 0;
public MainWindow()
{
InitializeComponent();
......@@ -27,6 +28,14 @@ namespace _10_3_WpfButton
private void Button_Click(object sender, RoutedEventArgs e)
{
count++;
LblCount.Content = $"Der Button wurde {count} mal angeklickt!";
}
private void MeineDoppelklickMethode(object sender, MouseButtonEventArgs e)
{
count+= 10;
LblCount.Content = $"Der Button wurde {count} mal angeklickt!";
}
}
......
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>_11_1_DataDriven</RootNamespace>
</PropertyGroup>
</Project>
using System;
using System.Collections.Generic;
using System.Text;
namespace _11_1_DataDriven
{
class MyInt
{
public delegate void Seiteneffekt(int x);
private int data;
public event Seiteneffekt Ausgabe;
public int Content
{
get => data;
set
{
data = value;
Ausgabe?.Invoke(data);
}
}
}
}
using System;
namespace _11_1_DataDriven
{
class Ausgabeaufbereitungen
{
public static void Textausgabe(int x)
{
Console.WriteLine($"Textausgabe: {x}");
}
public static void Balkenanzeige(int x)
{
for (int i = 0; i < x; i++)
Console.Write("*");
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
MyInt x1 = new MyInt();
x1.Ausgabe += Ausgabeaufbereitungen.Balkenanzeige;
x1.Ausgabe += Ausgabeaufbereitungen.Textausgabe;
x1.Content = 10;
x1.Content = 20;
x1.Content++;
}
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>_11_2_Delegate_Verkettung</RootNamespace>
</PropertyGroup>
</Project>
using System;
using System.Collections.Generic;
using System.Text;
namespace _11_2_Delegate_Verkettung
{
class MessageBox
{
public delegate void Modifier(ref string s);
public event Modifier Modify;
public void Send(string s)
{
Modify?.Invoke(ref s);
Console.WriteLine($"Der modifizierte String: {s}");
}
}
}
using System;
namespace _11_2_Delegate_Verkettung
{
class Program
{
static void ToUpper(ref string s)
{
s = s.ToUpper();
}
static void WortRest(ref string s)
{
s = s.Substring(6);
}
static void Main(string[] args)
{
MessageBox mb = new MessageBox();
mb.Modify += ToUpper;
mb.Modify += WortRest;
mb.Send("Hello World!");
}
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>_11_Ubg_Mailverteiler_Mo</RootNamespace>
</PropertyGroup>
</Project>
using System;
using System.Collections.Generic;
using System.Text;
namespace _11_Ubg_Mailverteiler_Mo
{
// Firma A
delegate void Callback(string s);
class MessageBox
{
public Callback Verteiler;
// Event = Einschränkung
// * Nur += und -= von außerhalb erlaubt
// * Aufruf der Event-Var nur durch Methoden von MessageBox
public void Send(string s)
{
// Etwaige Vorarbeiten vor dem Aufruf
Verteiler?.Invoke(s);
// ?. ~ (Verteiler == null) ? null : Verteiler.Invoke(s)
// Etwaige Nacharbeiten
}
}
}
using System;
namespace _11_Ubg_Mailverteiler_Mo
{
// Legen Sie ein Delegate void Callback(string s) an
// Erstellen Sie eine Klasse MessageBox mit
// - Einem Event verteiler
// - Einer Methode Send(string s), welche die verteiler Variable aufruft
// Experimentieren Sie ...
// 1) Legen Sie zwei Dummy-Klassen ClassA und ClassB an. Beide Klassen sollen öffentliche Methoden
// (statisch/nicht-statisch) besitzen, die der Callback-Signatur entsprechen
// 2) Definieren Sie auch in Main noch eine statische Methode, die der Callback-Signatur entspricht
// 3) Legen Sie eine Instanz der MessageBox an und registrieren Sie die Methoden in der Event-Variablen
// 4) Rufen Sie Send() mit einem Text auf
// 5) Entfernen Sie eine der registrierten Methoden und geben Sie noch einen Text aus
// Firma B
class DummyA
{
int a = 0;
public void Ausgabe(string text)
{
Console.WriteLine($"{text}: {++a} mal aufgerufen");
}
}
class DummyB
{
public static void PrintUpperCase(string txt)
{
Console.WriteLine($"{txt.ToUpper()}");
}
}
class Program
{
static void Main(string[] args)
{
MessageBox mb = new MessageBox();
DummyA a1 = new DummyA();
DummyA a2 = new DummyA();
mb.Verteiler += a1.Ausgabe;
mb.Verteiler += a2.Ausgabe;
mb.Verteiler += a2.Ausgabe;
mb.Verteiler += DummyB.PrintUpperCase;
mb.Verteiler = Console.WriteLine;
mb.Send("Erster Aufruf");
mb.Send("Zweiter Aufruf");
mb.Verteiler -= a2.Ausgabe;
mb.Send("Dritter Aufruf");
}
}
}
......@@ -83,7 +83,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "10-1 GenerischeListeMitSuch
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "10-Ubg HashDict-Di", "10-Ubg HashDict-Di\10-Ubg HashDict-Di.csproj", "{C903192E-44CA-42C3-A136-65E13026ECB1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "10-3 WpfButton", "10-3 WpfButton\10-3 WpfButton.csproj", "{11636803-CB01-4A29-ADAE-F03F3F38ED70}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "10-3 WpfButton", "10-3 WpfButton\10-3 WpfButton.csproj", "{11636803-CB01-4A29-ADAE-F03F3F38ED70}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "11-Ubg Mailverteiler-Mo", "11-Ubg Mailverteiler-Mo\11-Ubg Mailverteiler-Mo.csproj", "{C36B7276-D500-4147-853C-9B90418514B1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "11-1 DataDriven", "11-1 DataDriven\11-1 DataDriven.csproj", "{0799E33E-C645-4CBD-BD98-623E290E947C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "11-2 Delegate Verkettung", "11-2 Delegate Verkettung\11-2 Delegate Verkettung.csproj", "{0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
......@@ -255,6 +261,18 @@ Global
{11636803-CB01-4A29-ADAE-F03F3F38ED70}.Debug|Any CPU.Build.0 = Debug|Any CPU
{11636803-CB01-4A29-ADAE-F03F3F38ED70}.Release|Any CPU.ActiveCfg = Release|Any CPU
{11636803-CB01-4A29-ADAE-F03F3F38ED70}.Release|Any CPU.Build.0 = Release|Any CPU
{C36B7276-D500-4147-853C-9B90418514B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C36B7276-D500-4147-853C-9B90418514B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C36B7276-D500-4147-853C-9B90418514B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C36B7276-D500-4147-853C-9B90418514B1}.Release|Any CPU.Build.0 = Release|Any CPU
{0799E33E-C645-4CBD-BD98-623E290E947C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0799E33E-C645-4CBD-BD98-623E290E947C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0799E33E-C645-4CBD-BD98-623E290E947C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0799E33E-C645-4CBD-BD98-623E290E947C}.Release|Any CPU.Build.0 = Release|Any CPU
{0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment