diff --git a/05-2 IntroVererbungKfz/05-2 IntroVererbungKfz.csproj b/05-2 IntroVererbungKfz/06-1 IntroVererbungKfz.csproj similarity index 100% rename from 05-2 IntroVererbungKfz/05-2 IntroVererbungKfz.csproj rename to 05-2 IntroVererbungKfz/06-1 IntroVererbungKfz.csproj diff --git a/05-2 IntroVererbungKfz/KfzCoolStyle.cs b/05-2 IntroVererbungKfz/KfzCoolStyle.cs index 1e41dd2435e4afc5c85b14d2afb9e800e16ada5d..5ed9cc567c8777cf0157b480f6f94421b28d4ddf 100644 --- a/05-2 IntroVererbungKfz/KfzCoolStyle.cs +++ b/05-2 IntroVererbungKfz/KfzCoolStyle.cs @@ -4,13 +4,29 @@ using System.Text; namespace _05_2_IntroVererbungKfz { - class Kfz // KfzCoolStyle + abstract class Kfz // KfzCoolStyle // Ist die Basisklasse von mehreren kfz-Ausprägungen { - string kennzeichen; - public virtual double Steuern() { return -1; } + // public string kennzeichen; -- Nicht public machen! + + /* protected */ string kennzeichen; + // protected ~ öffentlich für abgeleitete Klassen + // ~ private für alle anderen + + public Kfz(string Kennzeichen) { kennzeichen = Kennzeichen; } + // Initialisierung bzw. Parameterübernahme unbedingt über + // den Konstruktor realisieren!!! + + // public virtual double Steuern() { return -1; } // virtual ~ Diese Methode kann/darf in einer // von Kfz abgeleiteten Klasse überschrieben werden + // (Dies muss aber nicht gemacht werden!) + + public abstract double Steuern(); + // abstract ~ Diese Methode MUSS in jeder + // von Kfz abgeleiteten Klasse überschrieben werden + + // Abstrakte Klasse --> von dieser Klasse können keine Objekte angelegt werden } class Pkw : Kfz // Pkw ist-ein Kfz @@ -21,14 +37,25 @@ namespace _05_2_IntroVererbungKfz { int hubraum=1599; int co2; + public Pkw(int Hubraum, int CO2, string Kennzeichen) + : base(Kennzeichen.ToLower()) + { + hubraum = Hubraum; + co2 = CO2; + } public override double Steuern() { return (hubraum + 99) / 100 * 2; } + public double CO2Wert() => co2; + } class Motorrad : Kfz { + public Motorrad(string Kennzeichen, int Hubraum) + : base (Kennzeichen) + { hubraum = Hubraum; } int hubraum = 250; public override double Steuern() { @@ -40,9 +67,35 @@ namespace _05_2_IntroVererbungKfz { int gewicht; int hubraum; - //public override double Steuern() - //{ - // return 556; - //} + public LKW(string Kennzeichen, int Gewicht, int Hubraum) + : base(Kennzeichen) + // Erst wird der Basisklassenkonstruktor aufgerufen + // DANN die eigene Initialiserung + { + // kennzeichen = Kennzeichen; + // Kein explizites Initialisieren von Basisklassen-Variablen!!! + gewicht = Gewicht; + hubraum = Hubraum; + } + public override double Steuern() + { + return 556; + } + } + class Tieflader : LKW + { + int zuladung; + public Tieflader(string Kennzeichen, int Gewicht, int Hubraum, int Zuladung) + : base(Kennzeichen,Gewicht,Hubraum) + { zuladung = Zuladung; } + //public override double Steuern() => 999; + // Wenn in der abgeleiteten Klasse eine Überschreibung der + // Basisklassenmethodendefinition erfolgt, wird die Definition + // aus der Basisklasse verwendet + + public override double Steuern() + { + return base.Steuern(); + } } } diff --git a/05-2 IntroVererbungKfz/Program.cs b/05-2 IntroVererbungKfz/Program.cs index 8a5c8c891b0ccc6f93c81c16c33bd44a55e58130..dd46df8c2cfc64ee440bffcef9095aa5edba6343 100644 --- a/05-2 IntroVererbungKfz/Program.cs +++ b/05-2 IntroVererbungKfz/Program.cs @@ -54,16 +54,18 @@ namespace _05_2_IntroVererbungKfz //motorrad[1].Steuern(); #endregion Kfz[] kfz = new Kfz[1000]; - kfz[0] = new LKW(); - kfz[1] = new Pkw(); - kfz[2] = new Motorrad(); - // kfz[3] = new Kfz(); + kfz[0] = new LKW("N-AB 123", 3500, 5000); + kfz[1] = new Pkw(1599, 2, "ER-XY 456"); + kfz[2] = new Motorrad("FÜ-CD 789",250); + kfz[3] = new Tieflader("AN-345", 20000, 4500, 12000); + // kfz[4] = new Kfz("XX-123"); + // Keine Objekte einer abstrakten Klasse anlegbar! //Console.WriteLine((kfz[0] as LKW).Steuern()); //Console.WriteLine(((Pkw)kfz[1]).Steuern()); //Console.WriteLine(((Motorrad)kfz[2]).Steuern()); - for (int i = 0; i < 3; i++) + for (int i = 0; i < 5; i++) { #region Lästige explizite Konvertierungen //if (kfz[i] is LKW) @@ -74,7 +76,20 @@ namespace _05_2_IntroVererbungKfz // Console.WriteLine(((Motorrad)kfz[i]).Steuern()); #endregion Console.WriteLine(kfz[i].Steuern()); + if (kfz[i] is Pkw) + Console.WriteLine((kfz[i] as Pkw).CO2Wert()); } + #region Statischer vs. dynamischer Typ einer Variablen + // Statischer Typ ~ der angegebene Typ einer Variablen + // kfz k -- kfz ist der statische Typ + // Dynamischer Typ ~ der tatsächliche Typ des darin gespeicherten Objekts + // kfz k = new Pkw -- Pkw ist der dynamische Typ + // + // Der STATISCHE TYP entscheidet über die Methodenauswahl, wenn kein virtual angegeben ist + // UND die zur Verfügung stehenden Methoden + // + // Bei virtual entscheidet der dynamische Typ + #endregion } } } diff --git a/06-Demo WPF-Anwendung/06-Demo WPF-Anwendung.csproj b/06-Demo WPF-Anwendung/06-Demo WPF-Anwendung.csproj new file mode 100644 index 0000000000000000000000000000000000000000..747f52ade07110c3a0ca2f6f08773f0f2663ac57 --- /dev/null +++ b/06-Demo WPF-Anwendung/06-Demo WPF-Anwendung.csproj @@ -0,0 +1,10 @@ +<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> + + <PropertyGroup> + <OutputType>WinExe</OutputType> + <TargetFramework>netcoreapp3.1</TargetFramework> + <RootNamespace>_06_Demo_WPF_Anwendung</RootNamespace> + <UseWPF>true</UseWPF> + </PropertyGroup> + +</Project> diff --git a/06-Demo WPF-Anwendung/App.xaml b/06-Demo WPF-Anwendung/App.xaml new file mode 100644 index 0000000000000000000000000000000000000000..d55817cc9e2e7f6393307a8fa19b8efef9e2cba5 --- /dev/null +++ b/06-Demo WPF-Anwendung/App.xaml @@ -0,0 +1,9 @@ +<Application x:Class="_06_Demo_WPF_Anwendung.App" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="clr-namespace:_06_Demo_WPF_Anwendung" + StartupUri="MainWindow.xaml"> + <Application.Resources> + + </Application.Resources> +</Application> diff --git a/06-Demo WPF-Anwendung/App.xaml.cs b/06-Demo WPF-Anwendung/App.xaml.cs new file mode 100644 index 0000000000000000000000000000000000000000..98831722f1de4f21f0f52308e740aec516e303d5 --- /dev/null +++ b/06-Demo WPF-Anwendung/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace _06_Demo_WPF_Anwendung +{ + /// <summary> + /// Interaction logic for App.xaml + /// </summary> + public partial class App : Application + { + } +} diff --git a/06-Demo WPF-Anwendung/AssemblyInfo.cs b/06-Demo WPF-Anwendung/AssemblyInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..8b5504ecfbb1bfbb008957f80ac70f8fcdab91dd --- /dev/null +++ b/06-Demo WPF-Anwendung/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/06-Demo WPF-Anwendung/MainWindow.xaml b/06-Demo WPF-Anwendung/MainWindow.xaml new file mode 100644 index 0000000000000000000000000000000000000000..302d1a36979b02cb086ae02b4f1e66bfb628dfe2 --- /dev/null +++ b/06-Demo WPF-Anwendung/MainWindow.xaml @@ -0,0 +1,15 @@ +<Window x:Class="_06_Demo_WPF_Anwendung.MainWindow" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:local="clr-namespace:_06_Demo_WPF_Anwendung" + mc:Ignorable="d" + Title="MainWindow" Height="450" Width="800"> + <Grid> + <Label x:Name="lbCounter" Content="Wertausgabe" HorizontalAlignment="Left" Margin="252,46,0,0" VerticalAlignment="Top"/> + <Button Content="Klick mich" HorizontalAlignment="Left" Margin="95,49,0,0" VerticalAlignment="Top" Click="Button_Click" RenderTransformOrigin="0.624,0.727"/> + + </Grid> + +</Window> diff --git a/06-Demo WPF-Anwendung/MainWindow.xaml.cs b/06-Demo WPF-Anwendung/MainWindow.xaml.cs new file mode 100644 index 0000000000000000000000000000000000000000..999df4f08ffc1cfd653b2adee4a8e721e53d6b93 --- /dev/null +++ b/06-Demo WPF-Anwendung/MainWindow.xaml.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace _06_Demo_WPF_Anwendung +{ + /// <summary> + /// Interaction logic for MainWindow.xaml + /// </summary> + public partial class MainWindow : Window + { + int counter = 0; + public MainWindow() + { + InitializeComponent(); + + } + + private void Button_Click(object sender, RoutedEventArgs e) + { + counter++; + lbCounter.Content = $"Neuer Zählerstand: {counter}"; + } + + + } +} diff --git a/06-UbgVererbung-Di/06-UbgVererbung-Di.csproj b/06-UbgVererbung-Di/06-UbgVererbung-Di.csproj new file mode 100644 index 0000000000000000000000000000000000000000..a17f15a507889937ba0b83bb81f63f90f989a734 --- /dev/null +++ b/06-UbgVererbung-Di/06-UbgVererbung-Di.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>netcoreapp3.1</TargetFramework> + <RootNamespace>_06_UbgVererbung_Di</RootNamespace> + </PropertyGroup> + +</Project> diff --git a/06-UbgVererbung-Di/GrObjekt.cs b/06-UbgVererbung-Di/GrObjekt.cs new file mode 100644 index 0000000000000000000000000000000000000000..d0ca60f66a238a348324d8fa86c16ca42f31162f --- /dev/null +++ b/06-UbgVererbung-Di/GrObjekt.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace _06_UbgVererbung_Di +{ + //Schreiben Sie drei Klassen Dreieck, Rechteck und Kreis mit jeweils einem Konstruktor + // Dreieck (int p1x, int p1y, int p2x, int p2y, int p3x, int p3y) + // Rechteck(int topX, int topY, int width, int height) + // Circle(int x, int y, int r) + // Erstellen Sie in Main() EIN Feld in dem Sie diese Objekte miteinander speichern können - + // hierfür ist die Erstellung einer gemeinsamen Basisklasse GrafischesObjekt erforderlich - + // und schreiben Sie eine for/foreach-Schleife, die für die jeweiligen Feldeinträge + // die entsprechende Ausgabe()-Methode aufruft. Hier reicht es aus, z.B. einfach Kreis(x,y,r) + // auszugeben. + class GrObjekt + { + public virtual void Ausgabe() { Console.WriteLine("ERROR"); } + // virtual ~ kann/muss-nicht überschrieben werden + // abstract ~ muss überschrieben werden + } + class Dreieck:GrObjekt // Dreieck ist-ein GrObjekt + { + int p1x, p1y, p2x, p2y, p3x, p3y; + public Dreieck(int p1x, int p1y, int p2x, int p2y, int p3x, int p3y) + { + this.p1x = p1x; this.p1y = p1y; + this.p2x = p2x; this.p2y = p2y; + this.p3x = p3x; this.p3y = p3y; + } + public override void Ausgabe() + { + Console.WriteLine($"Dreieck ({p1x},{p1y}), ({p2x},{p2y}), ({p3x},{p3y})"); + } + } + class Rechteck : GrObjekt + { + int topX, topY, width, height; + public Rechteck(int topX, int topY, int width, int height) + { + this.topX = topX; this.topY = topY; + this.width = width;this.height = height; + } + public override void Ausgabe() + { + Console.WriteLine($"Rechteck ({topX},{topY}), Breite: {width}, Höhe: {height}"); + } + } + class Circle : GrObjekt + { + int x, y, r; + public Circle(int x, int y, int r) + { + this.x = x; this.y = y; this.r = r; + } + public override void Ausgabe() + { + Console.WriteLine($"Kreis ({x},{y}), Radius: {r}"); + } + } +} diff --git a/06-UbgVererbung-Di/Program.cs b/06-UbgVererbung-Di/Program.cs new file mode 100644 index 0000000000000000000000000000000000000000..d0edffdc23a8406a184a0351001aea92d9348349 --- /dev/null +++ b/06-UbgVererbung-Di/Program.cs @@ -0,0 +1,26 @@ +using System; + +namespace _06_UbgVererbung_Di +{ + class Program + { + static void Main(string[] args) + { + GrObjekt[] objekte = new GrObjekt[3]; + objekte[0] = new Circle(10, 10, 5); + objekte[1] = new Rechteck(20,10, 10,10); + objekte[2] = new Dreieck(10, 10, 20,20,30,10); + + //GrObjekt o1 = new GrObjekt(); + //Dreieck d1 = (Dreieck) o1; -- geht nicht + + Dreieck d2 = new Dreieck(0, 10, 20, 20, 30, 10); + GrObjekt o2 = (GrObjekt) d2; + + foreach (var objekt in objekte) + { + objekt.Ausgabe(); + } + } + } +} diff --git a/Prog2WienkopSS2021.sln b/Prog2WienkopSS2021.sln index 8bbea28a04e4a6c80d7687742ea72e6e1ddea8aa..95256770c20e5c81fc4c8c97e86d9fda09fbd24f 100644 --- a/Prog2WienkopSS2021.sln +++ b/Prog2WienkopSS2021.sln @@ -35,11 +35,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "05-UbgCycleList-Mo", "05-Ub EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "05-1 BinTree", "05-1 BinTree\05-1 BinTree.csproj", "{7C9FA089-4364-4326-A973-99FD15DAFBC1}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "05-2 IntroVererbungKfz", "05-2 IntroVererbungKfz\05-2 IntroVererbungKfz.csproj", "{95016962-76A2-4029-9933-F87AAE6EC416}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "06-1 IntroVererbungKfz", "05-2 IntroVererbungKfz\06-1 IntroVererbungKfz.csproj", "{95016962-76A2-4029-9933-F87AAE6EC416}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "05-UbgBinTree-Di", "05-UbgBinTree-Di\05-UbgBinTree-Di.csproj", "{5CFBEC1D-F6F6-4A12-ACE6-560B677CCE3C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "06-UbgBinTree-Mo", "06-UbgBinTree-Mo\06-UbgBinTree-Mo.csproj", "{1CFE12AA-2BC6-40C4-BDB6-74B86F5235E4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "06-UbgBinTree-Mo", "06-UbgBinTree-Mo\06-UbgBinTree-Mo.csproj", "{1CFE12AA-2BC6-40C4-BDB6-74B86F5235E4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "06-UbgVererbung-Di", "06-UbgVererbung-Di\06-UbgVererbung-Di.csproj", "{55D60324-059C-4F36-B6BA-83D3D97D2526}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "06-Demo WPF-Anwendung", "06-Demo WPF-Anwendung\06-Demo WPF-Anwendung.csproj", "{E3C0CDD8-B068-4148-81DC-39F3C40B9805}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -123,6 +127,14 @@ Global {1CFE12AA-2BC6-40C4-BDB6-74B86F5235E4}.Debug|Any CPU.Build.0 = Debug|Any CPU {1CFE12AA-2BC6-40C4-BDB6-74B86F5235E4}.Release|Any CPU.ActiveCfg = Release|Any CPU {1CFE12AA-2BC6-40C4-BDB6-74B86F5235E4}.Release|Any CPU.Build.0 = Release|Any CPU + {55D60324-059C-4F36-B6BA-83D3D97D2526}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55D60324-059C-4F36-B6BA-83D3D97D2526}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55D60324-059C-4F36-B6BA-83D3D97D2526}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55D60324-059C-4F36-B6BA-83D3D97D2526}.Release|Any CPU.Build.0 = Release|Any CPU + {E3C0CDD8-B068-4148-81DC-39F3C40B9805}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3C0CDD8-B068-4148-81DC-39F3C40B9805}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3C0CDD8-B068-4148-81DC-39F3C40B9805}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3C0CDD8-B068-4148-81DC-39F3C40B9805}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE