From f1140471754e0cafd1d0052f48a394fdeaf2ee11 Mon Sep 17 00:00:00 2001
From: wienkop <uwe.wienkop@th-nuernberg.de>
Date: Tue, 27 Apr 2021 11:21:08 +0200
Subject: [PATCH] 2021-06-27 Vererbung (mit Ableitung, virtual, abstract,
 protected, override)

---
 ...z.csproj => 06-1 IntroVererbungKfz.csproj} |  0
 05-2 IntroVererbungKfz/KfzCoolStyle.cs        | 67 +++++++++++++++++--
 05-2 IntroVererbungKfz/Program.cs             | 25 +++++--
 .../06-Demo WPF-Anwendung.csproj              | 10 +++
 06-Demo WPF-Anwendung/App.xaml                |  9 +++
 06-Demo WPF-Anwendung/App.xaml.cs             | 17 +++++
 06-Demo WPF-Anwendung/AssemblyInfo.cs         | 10 +++
 06-Demo WPF-Anwendung/MainWindow.xaml         | 15 +++++
 06-Demo WPF-Anwendung/MainWindow.xaml.cs      | 38 +++++++++++
 06-UbgVererbung-Di/06-UbgVererbung-Di.csproj  |  9 +++
 06-UbgVererbung-Di/GrObjekt.cs                | 61 +++++++++++++++++
 06-UbgVererbung-Di/Program.cs                 | 26 +++++++
 Prog2WienkopSS2021.sln                        | 16 ++++-
 13 files changed, 289 insertions(+), 14 deletions(-)
 rename 05-2 IntroVererbungKfz/{05-2 IntroVererbungKfz.csproj => 06-1 IntroVererbungKfz.csproj} (100%)
 create mode 100644 06-Demo WPF-Anwendung/06-Demo WPF-Anwendung.csproj
 create mode 100644 06-Demo WPF-Anwendung/App.xaml
 create mode 100644 06-Demo WPF-Anwendung/App.xaml.cs
 create mode 100644 06-Demo WPF-Anwendung/AssemblyInfo.cs
 create mode 100644 06-Demo WPF-Anwendung/MainWindow.xaml
 create mode 100644 06-Demo WPF-Anwendung/MainWindow.xaml.cs
 create mode 100644 06-UbgVererbung-Di/06-UbgVererbung-Di.csproj
 create mode 100644 06-UbgVererbung-Di/GrObjekt.cs
 create mode 100644 06-UbgVererbung-Di/Program.cs

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 1e41dd2..5ed9cc5 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 8a5c8c8..dd46df8 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 0000000..747f52a
--- /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 0000000..d55817c
--- /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 0000000..9883172
--- /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 0000000..8b5504e
--- /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 0000000..302d1a3
--- /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 0000000..999df4f
--- /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 0000000..a17f15a
--- /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 0000000..d0ca60f
--- /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 0000000..d0edffd
--- /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 8bbea28..9525677 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
-- 
GitLab