diff --git a/07-1 Intro Interfaces/Classes.cs b/07-1 Intro Interfaces/Classes.cs index faa76b7842dc20bea1455db4ddb2d038678e70a8..a089c53b58047573dd2333c446ac9f56f0cd6c08 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 941e7af82b39b8e58a8c6e091116a4fc1783c6d9..73d2444e55a45a9b7737c655309d826a0c45582e 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 0000000000000000000000000000000000000000..24524bdef79168eeb876b9c939fde66826d13f66 --- /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 0000000000000000000000000000000000000000..9e08571673f9c8ab55067ce2ed267183f73f7c57 --- /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 0000000000000000000000000000000000000000..c52fd80616e7621b52e4fe5048cd4e223e05c35c --- /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 0000000000000000000000000000000000000000..c15a0293d52eba5c2d5a800fbf98e6a8b19b4f37 --- /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 0000000000000000000000000000000000000000..feba43eafcf7fa166cba41c332fa4d2f0ffe59f0 --- /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 e975705fc4be507cf69fa42eb5b274385376b012..199c918052a59b4e6612c6c4cc7edd600233208f 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 715a687021aaca4a75f9ecaac12154adae556f89..0026ad9d5e45c5ef2827a34039b8c34e243522fe 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