From e6c61b4940accb3d9acf80e72784b55478b3d5a6 Mon Sep 17 00:00:00 2001
From: wienkop <uwe.wienkop@th-nuernberg.de>
Date: Tue, 4 May 2021 11:17:11 +0200
Subject: [PATCH] 2021-05-04 Interfaces & Exceptions

---
 07-1 Intro Interfaces/Classes.cs              | 14 +++-
 07-1 Intro Interfaces/Program.cs              |  4 +-
 .../07-2 Intro Exceptions.csproj              |  9 +++
 07-2 Intro Exceptions/Program.cs              | 71 +++++++++++++++++++
 .../07-Ubg Warenwirtschaft-Di.csproj          |  9 +++
 07-Ubg Warenwirtschaft-Di/Classes.cs          | 69 ++++++++++++++++++
 07-Ubg Warenwirtschaft-Di/Program.cs          | 41 +++++++++++
 ...csproj => 07-UbgWarenwirtschaft-Mo.csproj} |  0
 07-UbgWarenwirtschaft/Program.cs              |  2 +
 Prog2WienkopSS2021.sln                        | 16 ++++-
 10 files changed, 230 insertions(+), 5 deletions(-)
 create mode 100644 07-2 Intro Exceptions/07-2 Intro Exceptions.csproj
 create mode 100644 07-2 Intro Exceptions/Program.cs
 create mode 100644 07-Ubg Warenwirtschaft-Di/07-Ubg Warenwirtschaft-Di.csproj
 create mode 100644 07-Ubg Warenwirtschaft-Di/Classes.cs
 create mode 100644 07-Ubg Warenwirtschaft-Di/Program.cs
 rename 07-UbgWarenwirtschaft/{07-UbgWarenwirtschaft.csproj => 07-UbgWarenwirtschaft-Mo.csproj} (100%)

diff --git a/07-1 Intro Interfaces/Classes.cs b/07-1 Intro Interfaces/Classes.cs
index faa76b7..a089c53 100644
--- a/07-1 Intro Interfaces/Classes.cs	
+++ b/07-1 Intro Interfaces/Classes.cs	
@@ -6,7 +6,8 @@ namespace _07_1_Intro_Interfaces
 {
     interface IBesteuerbar
     {
-        /* public abstract */ double Steuern();
+        /* public abstract */
+        double Steuern();
     }
     // Interface ist eine abstrakte Klasse
     // alle Methoden sind public und abstract
@@ -14,17 +15,28 @@ namespace _07_1_Intro_Interfaces
     interface IVerkaufbar
     {
         void Verkaufen();
+        //double Wert { get; set; }
     }
 
+
     abstract class Kfz : IBesteuerbar, IVerkaufbar
     {
+        // Je nach Anwendung: Property entweder in Kfz realisieren ...
+        //double wert;
+        //public double Wert { get => wert; set { wert = value; } }
+
+        // ... oder die Realisierung "weiterschieben"
+        //public abstract double Wert { get; set; }
+
         public abstract double Steuern();
         public abstract void Verkaufen();
         public abstract void Fahren();
+
     }
 
     class Pkw : Kfz
     {
+        public int AnzahlSitze { get; private set; }
         public override void Fahren()
         {
             Console.WriteLine("Pkw fährt");
diff --git a/07-1 Intro Interfaces/Program.cs b/07-1 Intro Interfaces/Program.cs
index 941e7af..73d2444 100644
--- a/07-1 Intro Interfaces/Program.cs	
+++ b/07-1 Intro Interfaces/Program.cs	
@@ -25,7 +25,7 @@ namespace _07_1_Intro_Interfaces
                 item.Verkaufen();
 
             IBesteuerbar[] bestObj = new IBesteuerbar[2];
-            int ind = 0;
+            //int ind = 0;
             for (int i = 0; i < verkObj.Length; i++)
             {
                 if (verkObj[i] is IBesteuerbar item)
@@ -35,7 +35,7 @@ namespace _07_1_Intro_Interfaces
 
             foreach (var item in bestObj)
             {
-                Console.WriteLine(  item.Steuern());
+                Console.WriteLine(item.Steuern());
             }
 
         }
diff --git a/07-2 Intro Exceptions/07-2 Intro Exceptions.csproj b/07-2 Intro Exceptions/07-2 Intro Exceptions.csproj
new file mode 100644
index 0000000..24524bd
--- /dev/null
+++ b/07-2 Intro Exceptions/07-2 Intro Exceptions.csproj	
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <RootNamespace>_07_2_Intro_Exceptions</RootNamespace>
+  </PropertyGroup>
+
+</Project>
diff --git a/07-2 Intro Exceptions/Program.cs b/07-2 Intro Exceptions/Program.cs
new file mode 100644
index 0000000..9e08571
--- /dev/null
+++ b/07-2 Intro Exceptions/Program.cs	
@@ -0,0 +1,71 @@
+using System;
+
+namespace _07_2_Intro_Exceptions
+{
+    class MeinFehler : Exception
+    {
+        public int FehlerCode { get; set; }
+        public MeinFehler(string message, int fehlercode) : base(message)
+        {
+            FehlerCode = fehlercode;
+        }
+    }
+    class Program
+    {
+        static void funktion1(int x)
+        {
+            if (x < 0)
+                throw new ArgumentOutOfRangeException("Argument darf nicht negativ sein");
+            Console.WriteLine("Funktion1: Ich war hier");
+        }
+        static void funktion2(int x)
+        {
+            if (x == 0)
+                throw new ArithmeticException("Argument darf nicht 0 sein");
+            Console.WriteLine("Funktion2: Ich war hier");
+        }
+        static void funktion3(int x)
+        {
+            if (x == 0)
+                throw new MeinFehler("Fehler in Funktion 3", x);
+            Console.WriteLine("Funktion3: Ich war hier");
+        }
+        static void Main(string[] args)
+        {
+            try
+            {
+                Console.WriteLine("Vor Funktion1");
+                funktion1(1);
+                funktion2(2);
+                funktion3(0);
+                Console.WriteLine("Nach Funktion1");
+            }
+            catch (ArgumentOutOfRangeException e)  // catch fängt FehlerTYPEN
+            {
+                Console.WriteLine("Es ist eine ArgumentOutOfRangeException aufgetreten");
+                Console.WriteLine($"Fehler: {e.Message}");
+            }
+            catch (ArithmeticException)  // catch fängt FehlerTYPEN
+            {
+                Console.WriteLine("Es ist ein Arithmetikfehler aufgetreten");
+            }
+            catch (MeinFehler mf)  // catch fängt FehlerTYPEN
+            {
+                Console.WriteLine($"{mf.Message} | {mf.FehlerCode}");
+            }
+            catch (Exception)   // Zuerst die spezifischen Fehler fangen, dann die allgemeineren!!!
+            {
+                Console.WriteLine("Es ist ein allgemeiner Fehler aufgetreten");
+            }
+            finally
+            {
+                Console.WriteLine("Wird immer ausgeführt");
+                // Zum Beispiel Dateien schließen, Ressourcen freigeben
+                // Bei ...
+                // Fehlerfreier Ausführung des try-Blocks
+                // Fehlerhafter Ausführung des try-Blocks mit und ohne catch 
+                //     (auch mit weiterem throw [mit und ohne Parameter] )
+            }
+        }
+    }
+}
diff --git a/07-Ubg Warenwirtschaft-Di/07-Ubg Warenwirtschaft-Di.csproj b/07-Ubg Warenwirtschaft-Di/07-Ubg Warenwirtschaft-Di.csproj
new file mode 100644
index 0000000..c52fd80
--- /dev/null
+++ b/07-Ubg Warenwirtschaft-Di/07-Ubg Warenwirtschaft-Di.csproj	
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <RootNamespace>_07_Ubg_Warenwirtschaft_Di</RootNamespace>
+  </PropertyGroup>
+
+</Project>
diff --git a/07-Ubg Warenwirtschaft-Di/Classes.cs b/07-Ubg Warenwirtschaft-Di/Classes.cs
new file mode 100644
index 0000000..c15a029
--- /dev/null
+++ b/07-Ubg Warenwirtschaft-Di/Classes.cs	
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace _07_Ubg_Warenwirtschaft_Di
+{
+    // Programmieren Sie ein rudimentäres System zur Verwaltung beliebiger Produkte
+    // Jedes Produkt soll die folgenden Eigenschaften besitzen, 
+    //      int stueckzahl, double preis, string name
+    // Es soll eigene (abstract oder nicht-abstract) Klassen für einzelne Produkte mit individuellen Datenfeldern geben: 
+    // - Metallwaren mit den Unterklassen Schrauben und Nägel
+    // - Milchprodukte mit den Unterklassen Joghurt und Butter 
+    // - Gartenprodukte mit den Unterklassen Pflanzen und Container; Schreiben Sie für die Pflanze eine besondere
+    //         Methode, die nur Pflanzen haben (z.B. Giessen)
+    // Erstellen Sie diese Klassen/Unterklassen mit geeigneten Konstruktoren, Basisklassenaufrufen, usw.
+    // Entscheiden Sie, wie Sie vererben wollen (virtual/abstract)
+    // Geben Sie für jede Klasse - wo sinnvoll - eine Überschreibung der ToString()-Methode an
+    // Legen Sie in Main() ein Feld mit einem Objekt je Klasse an, geben Sie alle Elemente in einer Schleife aus
+    // und schreiben Sie eine Methode, die z.B. nach der Pflanze über den Namen sucht und dieses Objekt zurückliefert
+    // Rufen Sie dann für die Pflanze diese besondere Methode auf.
+
+    interface IBegiessbar
+    {
+        void Giessen();
+    }
+    abstract class Produkt
+    {
+        int stueckzahl;
+        double preis;
+        // protected string name;
+        public string Name { get; protected set; }
+        // private: Nur die Methoden dieser Klasse Produkt dürfen das set-Name aufrufen
+        // protected: Die Methoden dieser Klasse Produkt und die Methoden der von Produkt
+        // abgeleiteten Klassen dürfen set-Name aufrufen; gilt auch transitiv
+        public Produkt(int stueckzahl, double preis, string name)
+        {
+            this.stueckzahl = stueckzahl;
+            this.preis = preis;
+            this.Name = name;
+        }
+        public double Wert() => preis * stueckzahl;
+    }
+    abstract class Gartenprodukte : Produkt
+    {
+        public Gartenprodukte(int stückzahl, double preis, string name)
+            : base(stückzahl, preis, name)
+            { }
+    }
+    class Pflanze : Gartenprodukte, IBegiessbar
+    {
+        public enum Pflanzentyp { zier, nutz };
+        Pflanzentyp typ;
+        public Pflanze(int stückzahl, double preis, string name, Pflanzentyp typ)
+            : base(stückzahl, preis, name)
+        {
+            this.typ = typ;
+        }
+        public void Giessen() { Console.WriteLine($"Pflanze {Name} wird gegossen"); }
+    }
+    class Froesche : Produkt, IBegiessbar
+    {
+        public Froesche(int stückzahl, double preis, string name)
+            : base(stückzahl, preis, name) { }
+        public void Giessen()
+        {
+            Console.WriteLine("Frosch wird begossen");
+        }
+    }
+}
diff --git a/07-Ubg Warenwirtschaft-Di/Program.cs b/07-Ubg Warenwirtschaft-Di/Program.cs
new file mode 100644
index 0000000..feba43e
--- /dev/null
+++ b/07-Ubg Warenwirtschaft-Di/Program.cs	
@@ -0,0 +1,41 @@
+using System;
+
+namespace _07_Ubg_Warenwirtschaft_Di
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            Produkt[] produkte = new Produkt[3];
+            produkte[0] = new Pflanze(10, 0.35, "Geranien", Pflanze.Pflanzentyp.zier);
+            produkte[1] = new Froesche(5, 2.49, "Hopper");
+            produkte[2] = new Pflanze(10, 0.55, "Salat", Pflanze.Pflanzentyp.nutz);
+            foreach (var item in produkte)
+            {
+                Console.WriteLine(item.Wert());
+                if (item is IBegiessbar)
+                {
+                    // item.Giessen(); -- Geht nicht, da der statische Typ die aufrufbaren Methoden def.
+                    if (item is Pflanze)
+                        ((Pflanze)item).Giessen();
+                    // Falls die Konvertierung in eine Pflanze nicht möglich ist --> Exception
+
+                    (item as Pflanze).Giessen();
+                    // Falls die Konvertierung in eine Pflanze nicht möglich ist --> as liefert null
+                    //   --> NullReferenceException
+
+                    (item as Pflanze)?.Giessen();
+                    // Nur wenn die Konvertierung funktioniert, wird Giessen() aufgerufen,
+                    // ansonsten "null" zurückgegeben;
+
+                    if (item is Pflanze pflanze)
+                        pflanze.Giessen();
+                    // Wenn item vom Typ "Pflanzen" ist, wird die konvertierte Objektreferenz in pflanze gespeichert
+
+                    Console.WriteLine("----------");
+                    (item as IBegiessbar)?.Giessen();
+                }
+            }
+        }
+    }
+}
diff --git a/07-UbgWarenwirtschaft/07-UbgWarenwirtschaft.csproj b/07-UbgWarenwirtschaft/07-UbgWarenwirtschaft-Mo.csproj
similarity index 100%
rename from 07-UbgWarenwirtschaft/07-UbgWarenwirtschaft.csproj
rename to 07-UbgWarenwirtschaft/07-UbgWarenwirtschaft-Mo.csproj
diff --git a/07-UbgWarenwirtschaft/Program.cs b/07-UbgWarenwirtschaft/Program.cs
index e975705..199c918 100644
--- a/07-UbgWarenwirtschaft/Program.cs
+++ b/07-UbgWarenwirtschaft/Program.cs
@@ -33,5 +33,7 @@ namespace _07_UbgWarenwirtschaft
                     (item as Pflanzen)?.Giessen();
                     // Konvertiere item zu Pflanze; wenn erfolgreich (d.h. != null) wird Giessen aufgerufen
                 }
+            }
+        }
     }
 }
diff --git a/Prog2WienkopSS2021.sln b/Prog2WienkopSS2021.sln
index 715a687..0026ad9 100644
--- a/Prog2WienkopSS2021.sln
+++ b/Prog2WienkopSS2021.sln
@@ -45,9 +45,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "06-UbgVererbung-Di", "06-Ub
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "06-Demo WPF-Anwendung", "06-Demo WPF-Anwendung\06-Demo WPF-Anwendung.csproj", "{E3C0CDD8-B068-4148-81DC-39F3C40B9805}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "07-UbgWarenwirtschaft", "07-UbgWarenwirtschaft\07-UbgWarenwirtschaft.csproj", "{46EE1C7D-DCEF-4291-8531-0000BD977FFB}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "07-UbgWarenwirtschaft-Mo", "07-UbgWarenwirtschaft\07-UbgWarenwirtschaft-Mo.csproj", "{46EE1C7D-DCEF-4291-8531-0000BD977FFB}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "07-1 Intro Interfaces", "07-1 Intro Interfaces\07-1 Intro Interfaces.csproj", "{D60AFAC5-6DB1-4F7A-AC86-B1C0D304F83F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "07-1 Intro Interfaces", "07-1 Intro Interfaces\07-1 Intro Interfaces.csproj", "{D60AFAC5-6DB1-4F7A-AC86-B1C0D304F83F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "07-Ubg Warenwirtschaft-Di", "07-Ubg Warenwirtschaft-Di\07-Ubg Warenwirtschaft-Di.csproj", "{CB0D1095-162B-4FD9-9B6D-5E06BE2EBC44}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "07-2 Intro Exceptions", "07-2 Intro Exceptions\07-2 Intro Exceptions.csproj", "{7E8671A1-00B5-4E86-AB29-67726F407BA1}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -147,6 +151,14 @@ Global
 		{D60AFAC5-6DB1-4F7A-AC86-B1C0D304F83F}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{D60AFAC5-6DB1-4F7A-AC86-B1C0D304F83F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{D60AFAC5-6DB1-4F7A-AC86-B1C0D304F83F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CB0D1095-162B-4FD9-9B6D-5E06BE2EBC44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CB0D1095-162B-4FD9-9B6D-5E06BE2EBC44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CB0D1095-162B-4FD9-9B6D-5E06BE2EBC44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CB0D1095-162B-4FD9-9B6D-5E06BE2EBC44}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7E8671A1-00B5-4E86-AB29-67726F407BA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7E8671A1-00B5-4E86-AB29-67726F407BA1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7E8671A1-00B5-4E86-AB29-67726F407BA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7E8671A1-00B5-4E86-AB29-67726F407BA1}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
-- 
GitLab