From ffc392ae86f92da53c951c075e7d7cac2ebb9484 Mon Sep 17 00:00:00 2001
From: Uwe Wienkop <uwe.wienkop@th-nuernberg.de>
Date: Tue, 15 Jun 2021 11:17:43 +0200
Subject: [PATCH] 2021-06-15 Abschluss

---
 09-1 KeyValueList/KeyValueList.cs            |  6 ++
 09-1 KeyValueList/Program.cs                 |  1 -
 11-5 BinTreePersVerwaltung/BinTree.cs        |  3 +-
 11-5 BinTreePersVerwaltung/Personal.cs       | 10 +--
 11-5 BinTreePersVerwaltung/Program.cs        | 73 +++++++++++++++++---
 12-3 VererbungRedo/12-3 VererbungRedo.csproj |  9 +++
 12-3 VererbungRedo/Program.cs                | 48 +++++++++++++
 12-UbgTransformingServer-Di/Program.cs       | 29 +++++++-
 12-UbgTransformingServer-Di/Server.cs        |  7 +-
 Prog2WienkopSS2021.sln                       |  6 ++
 10 files changed, 170 insertions(+), 22 deletions(-)
 create mode 100644 12-3 VererbungRedo/12-3 VererbungRedo.csproj
 create mode 100644 12-3 VererbungRedo/Program.cs

diff --git a/09-1 KeyValueList/KeyValueList.cs b/09-1 KeyValueList/KeyValueList.cs
index 57610ca..0ff2f7a 100644
--- a/09-1 KeyValueList/KeyValueList.cs	
+++ b/09-1 KeyValueList/KeyValueList.cs	
@@ -59,5 +59,11 @@ namespace _09_1_KeyValueList
                     AddEnd(key, value);
             }
         }
+        public KeyValueList<K,V> Copy()
+        {
+            KeyValueList<K,V> res = new KeyValueList<K, V>();
+            // ...
+            return res;
+        }
     }
 }
diff --git a/09-1 KeyValueList/Program.cs b/09-1 KeyValueList/Program.cs
index 3af6334..63124c8 100644
--- a/09-1 KeyValueList/Program.cs	
+++ b/09-1 KeyValueList/Program.cs	
@@ -23,7 +23,6 @@ namespace _09_1_KeyValueList
                 Console.WriteLine($"Telefonnummer von {item.key}: {item.val}");
             }
 
-
             List<string> termineMo = new List<string>();
             termineMo.Add("08:00 Dig. Bildbearbeitung");
             termineMo.Add("09:45 Prog2 Übung");
diff --git a/11-5 BinTreePersVerwaltung/BinTree.cs b/11-5 BinTreePersVerwaltung/BinTree.cs
index fd655e4..ea255b1 100644
--- a/11-5 BinTreePersVerwaltung/BinTree.cs	
+++ b/11-5 BinTreePersVerwaltung/BinTree.cs	
@@ -5,7 +5,8 @@ using System.Text;
 
 namespace _11_5_BinTreePersVerwaltung
 {
-    class BinTree<T> where T:IComparable<T>
+    class BinTree<T> : IEnumerable
+        where T:IComparable<T>
     {
         class Node
         {
diff --git a/11-5 BinTreePersVerwaltung/Personal.cs b/11-5 BinTreePersVerwaltung/Personal.cs
index c394b71..489c491 100644
--- a/11-5 BinTreePersVerwaltung/Personal.cs	
+++ b/11-5 BinTreePersVerwaltung/Personal.cs	
@@ -4,7 +4,7 @@ using System.Text;
 
 namespace _11_5_BinTreePersVerwaltung
 {
-    abstract class Personal
+    abstract class Personal : IComparable<Personal>
     {
         public virtual string Name { get; set; }
 
@@ -16,16 +16,14 @@ namespace _11_5_BinTreePersVerwaltung
         //}
         public Personal (string Name) { this.Name = Name; }
         abstract public double Kosten { get; }
+        public int CompareTo(Personal other) => Name.CompareTo(other.Name);
     }
     class Mitarbeiter : Personal 
     {
         protected double gehalt;
         public Mitarbeiter(string Name, double Gehalt) : base(Name) { gehalt = Gehalt; }
         public override double Kosten { get => 12.65 * gehalt; }
-        public override string ToString()
-        {
-            return base.ToString();
-        }
+        public override string ToString() => $"{Name,-15} {Kosten,6}";
     }
     class Führungskraft : Personal 
     {
@@ -37,6 +35,7 @@ namespace _11_5_BinTreePersVerwaltung
             erfolgsbeteiligung = Erfolgsbeteiligung;
         }
         public override double Kosten { get => 12.65 * gehalt + erfolgsbeteiligung; }
+        public override string ToString() => $"{Name,-15} {Kosten,6}";
     }
     class Werkvertragler : Personal 
     {
@@ -46,5 +45,6 @@ namespace _11_5_BinTreePersVerwaltung
             betrag = Betrag;
         }
         public override double Kosten { get => betrag; }
+        public override string ToString() => $"{Name,-15} {Kosten,6}";
     }
 }
diff --git a/11-5 BinTreePersVerwaltung/Program.cs b/11-5 BinTreePersVerwaltung/Program.cs
index 4a33340..b50efcf 100644
--- a/11-5 BinTreePersVerwaltung/Program.cs	
+++ b/11-5 BinTreePersVerwaltung/Program.cs	
@@ -1,27 +1,78 @@
 using System;
+using System.Linq;
 
 namespace _11_5_BinTreePersVerwaltung
 {
     class Program
     {
+        static void InputData(BinTree<Personal> pt)
+        {
+            pt.Insert(new Mitarbeiter("Dieter", 2000));
+            pt.Insert(new Führungskraft("Anton", 5000, 10000));
+            pt.Insert(new Werkvertragler("Gustav", 12000));
+            pt.Insert(new Mitarbeiter("Heiner", 2000));
+            pt.Insert(new Werkvertragler("Berta", 10000));
+            pt.Insert(new Werkvertragler("Ludwig", 12000));
+            pt.Insert(new Mitarbeiter("Klaus", 2000));
+            pt.Insert(new Mitarbeiter("Ida", 2000));
+            pt.Insert(new Führungskraft("Charles", 5000, 10000));
+            pt.Insert(new Werkvertragler("Johanna", 10000));
+            pt.Insert(new Mitarbeiter("Emma", 2000));
+            pt.Insert(new Mitarbeiter("Franz", 10000));
+            pt.Insert(new Werkvertragler("Norbert", 10000));
+            pt.Insert(new Werkvertragler("Willi", 10000));
+            pt.Insert(new Mitarbeiter("Quasimodo", 2500));
+            pt.Insert(new Führungskraft("Manni", 5200, 15000));
+            pt.Insert(new Mitarbeiter("Otto", 10000));
+            pt.Insert(new Werkvertragler("Uwe", 10000));
+            pt.Insert(new Werkvertragler("Stefan", 10000));
+            pt.Insert(new Mitarbeiter("Victoria", 2500));
+            pt.Insert(new Mitarbeiter("Thorsten", 10000));
+            pt.Insert(new Werkvertragler("Rainer", 10000));
+            pt.Insert(new Werkvertragler("Zacharias", 10000));
+            pt.Insert(new Mitarbeiter("Yvonne", 3000));
+            pt.Insert(new Führungskraft("Volker", 5100, 10000));
+            pt.Insert(new Mitarbeiter("Xaver", 2500));
+        }
         static void Main(string[] args)
         {
-            BinTree<int> bt = new BinTree<int>();
-            bt.Insert(50);
-            bt.Insert(25);
-            bt.Insert(40);
+            //BinTree<int> bt = new BinTree<int>();
+            //bt.Insert(50);
+            //bt.Insert(25);
+            //bt.Insert(40);
+
+            //foreach (var item in bt)
+            //{
+            //    Console.WriteLine(item);
+            //}
+
+            BinTree<Personal> persBaum = new BinTree<Personal>();
+            InputData(persBaum);
+            persBaum.Print();
 
-            foreach (var item in bt)
+            var res = from Personal p in persBaum
+                      where p is Führungskraft
+                      orderby p.Kosten
+                      select new { Name = p.Name.ToUpper(), Kosten = p.Kosten };
+            foreach (var item in res)
             {
                 Console.WriteLine(item);
             }
 
-            //Personal[] persFeld = new Personal[10];
-            //persFeld[0] = new Mitarbeiter("Xaver", 3000);
-            //foreach (var item in persFeld)
-            //{
-            //    Console.WriteLine(item.Kosten);
-            //}
+
+            double GesKosten = res.Sum(w => w.Kosten);
+            Console.WriteLine("Kosten für die Führungskräfte: "+GesKosten);
+
+            int anz = res.Count();
+            Console.WriteLine(anz + " Führungskräfte");
+
+
+            var res2 = from Personal p in persBaum
+                      where p.Kosten < 30000
+                      orderby p.Kosten descending, p.Name descending // Sortierung nach Kosten, dann Name
+                      select new { Name = p.Name, K = p.Kosten };
+            foreach (var item in res2)
+                Console.WriteLine(item.Name+": "+item.K);
         }
     }
 }
diff --git a/12-3 VererbungRedo/12-3 VererbungRedo.csproj b/12-3 VererbungRedo/12-3 VererbungRedo.csproj
new file mode 100644
index 0000000..aac8227
--- /dev/null
+++ b/12-3 VererbungRedo/12-3 VererbungRedo.csproj	
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <RootNamespace>_12_3_VererbungRedo</RootNamespace>
+  </PropertyGroup>
+
+</Project>
diff --git a/12-3 VererbungRedo/Program.cs b/12-3 VererbungRedo/Program.cs
new file mode 100644
index 0000000..6615a04
--- /dev/null
+++ b/12-3 VererbungRedo/Program.cs	
@@ -0,0 +1,48 @@
+using System;
+
+namespace _12_3_VererbungRedo
+{
+    class Basis
+    {
+        public virtual void Ausgabe(string s)
+        {
+            // virtual ~ Diese Methode KANN in abgeleiteten Klassen überschrieben werden
+            // abstract ~ Diese Methode MUSS in abgeleiteten Klassen überschrieben werden!
+            //            Hier keine Implementierung!
+            Console.WriteLine("Ausgabe: "+s);
+        }
+    }
+
+    class PKW:Basis
+    {
+        public override void Ausgabe(string s)
+        {
+            Console.WriteLine("Meine wunderschöne PKW-Ausgabe "+s);
+        }
+    }
+    class LKW : Basis
+    {
+        public override void Ausgabe(string s)
+        {
+            Console.WriteLine("Meine wunderschöne LKW-Ausgabe " + s);
+        }
+    }
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            Basis[] f = new Basis[5];
+            f[0] = new PKW();
+            f[1] = new LKW();
+            f[0].Ausgabe("Hallo");
+            // Ohne virtual:
+            // Methodenauswahl gemäß des statischen Typs (hier: Basis)
+            //(f[0] as PKW).Ausgabe2("Hallo");
+
+            // Mit virtual plus override:
+            // Methodenauswahl gemäß des dynamischen Typs (hier: PKW.Ausgabe())
+            f[1].Ausgabe("Hallo2");
+
+        }
+    }
+}
diff --git a/12-UbgTransformingServer-Di/Program.cs b/12-UbgTransformingServer-Di/Program.cs
index 1b38873..087c853 100644
--- a/12-UbgTransformingServer-Di/Program.cs
+++ b/12-UbgTransformingServer-Di/Program.cs
@@ -8,10 +8,26 @@ namespace _12_UbgTransformingServer
         public Client(string Name) { this.Name = Name; }
 
         // ToDo: statische "Listener" Methode
+        public static void Ausgabe(string msg)
+        {
+            Console.WriteLine($"static: {msg}");
+        }
         // ToDo: nicht-statische "Listener" Methode
+        public void Listen(string msg)
+        {
+            Console.WriteLine($"nicht-static: {Name}: {msg}");
+        }
     }
     class Program
     {
+        static void OldNewCorp(ref string msg)
+        {
+            msg = msg.Replace("ZZZ", "AAA");
+        }
+        static void Signature(ref string msg)
+        {
+            msg += "\npowered by wonderland server";
+        }
         // ToDo: Realisieren Sie die folgenden Transformationen:
         //    x  Signature ( ... ) fügt der Nachricht eine Signatur an
         //    x  OldNewCorp ( ... ) ersetzt ZZZ durch AAA
@@ -21,19 +37,28 @@ namespace _12_UbgTransformingServer
             MsgServer server = new MsgServer();
             // ToDo: Fügen Sie einige Transformationen hinzu
             // msg --> OldNewCorp  --> Signature
-            
+            server.Transformations += OldNewCorp;
+            server.Transformations += Signature;
+
             Client mueller = new Client("Müller");
             Client meier = new Client("Meier");
             Client huber = new Client("Huber");
 
             // ToDo: Registrieren Sie einige Listener 
+            server.Notify += Client.Ausgabe;
+            server.Notify += meier.Listen;
 
             server.SendMsg("Herzlich Willkommen, liebe Kunden! ZZZ Corporation");
 
             // ToDo: Registrieren Sie weitere Listener an und entfernen
             //       Sie einen Listener
-            
+            server.Notify -= meier.Listen;
+            server.Notify += mueller.Listen;
+            server.Notify += huber.Listen;
+            Console.WriteLine("---------");
             // ToDo: Entfernen Sie die Signature Transformation
+            server.Transformations -= Signature;
+
             server.SendMsg("Wir wünschen einen erfolgreichen Tag, liebe Kunden, ZZZ Corporation");
         }
     }
diff --git a/12-UbgTransformingServer-Di/Server.cs b/12-UbgTransformingServer-Di/Server.cs
index 1f864c8..ca8bb6a 100644
--- a/12-UbgTransformingServer-Di/Server.cs
+++ b/12-UbgTransformingServer-Di/Server.cs
@@ -4,19 +4,22 @@ using System.Text;
 
 namespace _12_UbgTransformingServer
 {
-    delegate void Callback(string notifier);
+    //delegate void Callback(string notifier);
     delegate void Transform(ref string msg);
     class MsgServer
     {
         // ToDo: Notify-Event anlegen
+        public event Action<string> Notify;
         // ToDo: Transformations-Event anlegen
+        public event Transform Transformations;
 
         public void SendMsg(string msg)
         {
             Console.WriteLine($"\n\n\nOriginal-Nachricht: {msg}");
             // ToDo: Alle in Transformations gespeicherten Transformationen anwenden
-            
+            Transformations?.Invoke(ref msg);
             // ToDo: Den "transformierten" String an alle in Notify gespeicherten Listener versenden
+            Notify?.Invoke(msg);
         }
     }
 }
diff --git a/Prog2WienkopSS2021.sln b/Prog2WienkopSS2021.sln
index 191214c..6c9328c 100644
--- a/Prog2WienkopSS2021.sln
+++ b/Prog2WienkopSS2021.sln
@@ -107,6 +107,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "12-1 NewOverride", "12-1New
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "12-2 Delegateaufrufausbreitung", "12-2 Delegateaufrufausbreitung\12-2 Delegateaufrufausbreitung.csproj", "{30C34E16-FFAF-48A5-8F3F-AE3A7CF7B56D}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "12-3 VererbungRedo", "12-3 VererbungRedo\12-3 VererbungRedo.csproj", "{882C4C12-B62B-4BDB-A52C-C1D62E9B0D6A}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -321,6 +323,10 @@ Global
 		{30C34E16-FFAF-48A5-8F3F-AE3A7CF7B56D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{30C34E16-FFAF-48A5-8F3F-AE3A7CF7B56D}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{30C34E16-FFAF-48A5-8F3F-AE3A7CF7B56D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{882C4C12-B62B-4BDB-A52C-C1D62E9B0D6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{882C4C12-B62B-4BDB-A52C-C1D62E9B0D6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{882C4C12-B62B-4BDB-A52C-C1D62E9B0D6A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{882C4C12-B62B-4BDB-A52C-C1D62E9B0D6A}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
-- 
GitLab