--- author: Florian Fischer aspectratio: 169 --- ## Wir bauen ein Auto `\begin{center}`{=latex} ![](img/Copyrighted/car_explosion.png){height=85%} `\end{center}`{=latex} ## \faIcon{chalkboard-teacher} Wiederholung: \only<2->{Kardinalitäten} \begin{tikzpicture} \begin{class}[text width=3cm]{Auto}{0,0} \attribute{...} \operation{...} \end{class} \begin{class}[text width=3cm]{Bauteil}{9,0} \attribute{...} \operation{...} \end{class} \association{Auto}{\boldred{1}}{besteht aus >}{Bauteil}{< verbaut in}{\boldred{n}} \end{tikzpicture} \vspace{1cm} \only<-2>{\phantom{ Hilft uns diese Modellierung beim Konstruieren eines Autos? }} \only<3->{ Hilft uns diese Modellierung beim Konstruieren eines Autos? } ## \faIcon{chalkboard-teacher} Wiederholung: \only<2->{Vererbung} \only<3->{(Spezialisierung)} \vspace{0.1cm} \begin{tikzpicture} \begin{class}[text width=3cm]{Auto}{0, 2.5} \attribute{...} \operation{...} \end{class} \begin{class}[text width=3cm]{Bauteil}{5, 2.5} \attribute{...} \operation{...} \end{class} \association{Auto}{1}{}{Bauteil}{n}{} \begin{class}[text width=4cm]{Motor}{10, 0} \inherit{Bauteil} \attribute{...} \operation{...} \end{class} \begin{class}[text width=4cm]{Felge}{10, 2.5} \inherit{Bauteil} \attribute{...} \operation{...} \end{class} \begin{class}[text width=4cm]{Windschutzscheibe}{10, 5} \inherit{Bauteil} \attribute{...} \operation{...} \end{class} \node[below=0.2cm of Motor] (spez) {speziell}; \node (allg) at (Bauteil |- spez) {allgemein}; \draw[{Triangle[open]}-] (allg) -- (spez); \end{tikzpicture} ## \faIcon{desktop} Arbeitsauftrag: Bälle \hfill 15min \let\tightlist\relax 1. Öffne das **Baelle** Projekt 2. Erzeuge einen Ball und einen Flummi und starte die *Simulation* 3. Zeichne ein Klassendiagramm der Klassen `Flummi`, `Ball` und `Kreis`. (Die Attribute und Methoden der Klasse `Kreis` können weggelassen werden) 4. Untersuche, wie das Konzept der Vererbung in Java umgesetzt wurde. \hfill{} *Nicht der Physik-Lehrkraft zeigen!* `\o/` ## Klassendiagramm \begin{tikzpicture} \begin{class}[text width=3cm]{Kreis}{0, 0} \attribute{...} \operation{...} \end{class} \begin{class}[text width=4.5cm]{Ball}{5, 0} \inherit{Kreis} \attribute{geschwindigkeit} \operation{act()} \end{class} \begin{class}[text width=3cm]{Flummi}{10, 0} \inherit{Ball} \attribute{bounceFaktor} \operation{act()} \end{class} \end{tikzpicture} ## \faIcon{pencil-alt} Vererbung in Java {.t} Das Java Schlüsselwort ... ## \faIcon{pencil-alt} Vererbung in Java {.t} Das Java Schlüsselwort `extends`{.java} drückt eine Vererbungsbeziehung zwischen zwei Klassen aus. \vspace{0.5cm} \pause ::: {.block} ### Syntax der Klassendefinition `class Unterklasse extends Oberklasse {...}`{.java} ::: \vspace{0.5cm} \pause Die Unterklasse erbt alle Methoden und Attribute der Oberklasse. Man spricht: "Eine Felge *ist* ein Bauteil". Oder: "Ein Flummi *ist* ein Ball". \pause \begin{tikzpicture}[overlay, remember picture] \node[rotate=-30,scale=3] at (12, 3) {\Huge \boldred{!}}; \end{tikzpicture} ## \faIcon{chalkboard-teacher} Wiederholung: Vererbung in Java ::: columns :::: {.column width=40%} ```java class Oberklasse { private int zahl; public void Oberklasse(int n) { zahl = n; } public int gibZahl() { return zahl; } } ``` :::: :::: {.column width=50%} ```java class Unterklasse extends Oberklasse { public void Unterklasse(int n) { // Oberklasse Initialisierung? } } ``` :::: ::: ## \faIcon{chalkboard-teacher} Wiederholung: Vererbung in Java ::: columns :::: {.column width=40%} ```java class Oberklasse { private int zahl; public void Oberklasse(int n) { zahl = n; } public int gibZahl() { return zahl; } } ``` :::: :::: {.column width=50%} ```{.java highlightlines=\{4\}} class Unterklasse extends Oberklasse { public void Unterklasse(int n) { super(n); } } ``` :::: ::: ## \faIcon{pencil-alt} Vererbung in Java 2. {.t} \vspace{1cm} Die Oberklasse ist über das Java Schlüsselwort ... benutzbar. ## \faIcon{pencil-alt} Vererbung in Java 2. {.t} \vspace{1cm} Die Oberklasse ist über das Java Schlüsselwort `super`{.java} benutzbar. \vspace{1cm} \pause ### Beispiele * `super(...)`{.java} Konstruktoraufruf der Oberklasse * `super.zahl`{.java} Attribut der Oberklasse * `super.zahlGeben()`{.java} Methodenaufruf der Oberklasse \pause \begin{tikzpicture}[overlay, remember picture] \node[rotate=-30,scale=3] at (12, 3) {\Huge \color{red} \textbf{!}}; \end{tikzpicture} ## Polymorphismus \begin{center} griechisch Vielgestaltigkeit \end{center} `\begin{center}`{=latex} ![](img/wolpertinger.jpg) `\end{center}`{=latex} ## \faIcon{desktop}/\faIcon{pencil-alt} Arbeitsauftrag Tierheimverwaltung \hfill 15min \let\tightlist\relax * **AUFGABE 0:** Öffne das Projekt **Tierheim** und mache dich kurz damit vertraut. * **AUFGABE 1:** Überlege dir, wie du unterschiedliche Tiere im Tierheim speicherst und setze deine Überlegung um * **AUFGABE 2:** Begründe warum Pluto (Objekt der Klasse Hund) nicht ins Tierheim aufgenommen werden kann ## Polymorphismus > ... ist die Eigenschaft, dass ein **Referenzattribut** nicht nur Objekte der als Datentyp angegebenen Klasse referenzieren kann, sondern auch Objekte **aller** zu dieser Klasse existierenden **Unterklassen**. ## Polymorphismus \begin{tikzpicture}[scale=0.5] \begin{object}[text width=3.5cm]{th1}{0,0.5} \instanceOf{Tierheim} \attribute{tiere[0]} \attribute{tiere[1]} \attribute{...} \end{object} \begin{object}[text width=4cm]{t1}{12,0} \instanceOf{Tier} \attribute{name="Wolle"} \attribute{geschlecht="ungewiss"} \end{object} \begin{object}[text width=4cm]{h1}{12,5} \instanceOf{Hund} \attribute{name="Pluto" } \attribute{geschlecht="maennlich"} \attribute{rasse="comic"} \end{object} \only<2->{ \node[fill=black, circle, minimum size=0.075cm] (circle) at (2.2, -2.35) {}; \draw[line width=2pt, -latex] (circle) edge [bend right=15] (8, -0.5) {}; } \only<3> { \node[fill=black, circle, minimum size=0.075cm] (circle2) at (2.2, -1.4) {}; \draw[line width=2pt, -latex] (circle2) edge [bend left=30] (8, 4.5) {}; } \end{tikzpicture} ## \faIcon{desktop}/\faIcon{pencil-alt} Arbeitsauftrag Tierheimverwaltung Fortsetzung \let\tightlist\relax * **AUFGABE 3:** Vervollständige die Klasse `Hund` als Spezialisierung der Klasse `Tier` * **AUFGABE 4:** Implementiere die Methode `Tierheim.besuchen()`{.java} und überlege dir welche Ausgaben das Programm machen wird. Überprüfe deine Vermutung in dem du das Programm ausführst. ## \faIcon{pencil-alt} Polymorphismus > ... ist die Eigenschaft, dass ein **Referenzattribut** nicht nur Objekte der als Datentyp angegebenen Klasse referenzieren kann, sondern auch Objekte **aller** zu dieser Klasse existierenden **Unterklassen**. \vspace{1cm} > Wird ein **Objekt einer Unterklasse** über dieses Referenzattribut referenziert, so werden Attribute und Methoden verwendet, wie sie in **dessen Klasse** bekannt sind (und nicht die überschriebenen Methoden der Oberklasse). \pause \begin{tikzpicture}[overlay, remember picture] \node[rotate=-20,scale=3] at (12, -0.5) {\Huge \boldred{!}}; \end{tikzpicture} ## \faIcon{chalkboard-teacher} Beispiel: Polymorphismus Was gibt dieses Programm aus? ```java Tier pluto = new Hund("pluto", "maennlich", "comic"); pluto.gibLaut(); ``` \pause ::: {.block} ### Ausgabe `Wuff` ::: Da der **Polymorphismus** dafür sorgt, dass die Methode ausgeführt wird, so wie sie in der Unterklasse `Hund` bekannt ist.