## Rennbahn \vspace{-0.75cm} ![](img/rennbahn.jpg){.center} ## \faIcon{pencil-alt} Arbeitsauftrag - Modellierung 5 min {.standout} Erstelle eine Klassendiagramm (mehrere Klassenkarten) zu allen Klassen, die du beim Rennen entdecken kannst. ## Von der Klassenkarte zum Code ::: {.columns align=center} :::: {.column width=30%} \begin{tikzpicture} \begin{class}[text width=4cm]{Auto}{0, 0} \attribute{geschwindigkeit} \attribute{farbe} \operation{bewegen()} \end{class} \only<1>{ \draw[->, opacity=0] (Auto) edge[above, red] node {1.} ($(Auto.north east) + (1, 2)$); } \only<2->{ \draw[->] (Auto) edge[above, red] node[] {1.} ($(Auto.north east) + (1, 2)$); } \only<3->{ \draw[] ($(Auto.east) + (0, 0.5)$) edge[->, left, blue] node[] {2.} ($(Auto.east) + (1, 1.5)$); } \only<4->{ \draw[] ($(Auto.south east) + (0, 0.5)$) edge[->, above, teal] node {3.} ($(Auto.south east) + (1, 1)$); } \end{tikzpicture} :::: :::: {.column width=60%} ```java class Auto { // Klassendefinition // Attribute int geschwindigkeit; String farbe; // Methoden void bewegen() { ... } } ``` :::: ::: ## Von der Klasse zum Objekt ::: {.columns align=center} :::: {.column width=45%} \begin{tikzpicture} \begin{class}[text width=4cm]{Auto}{0, 0} \attribute{geschwindigkeit} \attribute{farbe} \operation{bewegen()} \end{class} \end{tikzpicture} :::: :::: {.column width=5%} \Large $\Rightarrow$ :::: :::: {.column width=45%} \pause \begin{tikzpicture} \begin{object}[text width=4cm]{a1: Auto}{0, 0} \attribute{geschwindigkeit = 2} \attribute{farbe = "blau"} \end{object} \end{tikzpicture} :::: ::: \vspace{1cm} \pause ### \faIcon{lightbulb} Wo kommen die Attributwerte her? \pause Sie müssen beim Erzeugen eines Objekts angegeben werden. ## Objekte erzeugen Objekte einer Klasse werden mit dem Schlüsselwort `new`{.java} erzeugt. \pause ### \faIcon{pencil-alt} [Der Konstruktor]{.underline} >- **Methode** der Klasse, die beim Erzeugen eines neuen Objekts aufgerufen wird. >- Heißt immer wie die Klasse. >- Hat [keine]{.underline} Angabe eines Rückgabetyps. \pause ::: {.columns} :::: {.column width=35%} \vspace{0.5cm} \begin{tikzpicture} \begin{class}[text width=4cm]{Auto}{0, 0} \attribute{geschwindigkeit} \attribute{farbe} \operation{...} \end{class} \end{tikzpicture} :::: :::: {.column width=65%} ```java class Auto { int geschwindigkeit; // Attribute int farbe; Auto() { // Konstruktor geschwindigkeit = 2; farbe = "blau"; } ``` :::: ::: ## \faIcon{desktop} Arbeitsauftrag - Ergänze den Konstruktor der Klasse Auto \hfill 10 min Öffne den **Rennbahn** Workspace in der Online-IDE. \large 1. Ergänze den **Konstruktor** der Klasse `Auto` Der Konstruktor soll die `geschwindigkeit` auf 2 initialisieren \faIcon{earlybirds} **Für Schnelle**: Erzeuge eine eine Rakete im Konstruktor der Klasse `Rennbahn`. ## \faIcon{pencil-alt} Konstruktor \only<2->{mit Parametern} ### \faIcon{lightbulb} Was wenn die Attributwerte nicht immer gleich sein sollen? \pause $\Rightarrow$ Der Konstruktor ist eine [Methode]{.underline}, der wir \boldred{Parameter} übergeben können. \vspace{0.5cm} ::: {.columns align=center} :::: {.column width=40%} \pause `new Auto(5, "gruen");`{.java} :::: :::: {.column width=5%} \Large $\Rightarrow$ :::: :::: {.column width=45%} \pause \begin{tikzpicture} \begin{object}[text width=4cm]{a1: Auto}{0, 0} \attribute{geschwindigkeit = 5} \attribute{farbe = "gruen"} \end{object} \end{tikzpicture} :::: ::: \pause ```java class Auto { Auto(PARAMETER) { geschwindigkeit = ...; farbe = ...; } ... ``` ## \faIcon{desktop} Arbeitsauftrag - `Auto` **Konstruktor** mit Parametern \large 3. Ergänze den Konstruktor der Klasse `Auto`: * die Geschwindigkeit soll angegeben werden können * die Farbe soll angegeben werden können \vspace{0.5cm} \faIcon{earlybirds} **Für Schnelle:** Implementiere eine neue Klasse `Bus` als Unterklasse von `Actor` mit Geschwindigkeit 3. ## Zweimal der gleiche Code? ::: {.columns} :::: {.column width=50%} ```java class Rakete extends Actor { int geschwindigkeit = 20; void act() { forward(-geschwindigkeit); } } ``` :::: :::: {.column width=50%} ```java class Bus extends Actor { int geschwindigkeit = 3; void act() { forward(-geschwindigkeit); } } ``` :::: ::: \pause **Geht das nicht besser?** ## \faIcon{pencil-alt} Vererbung Eine Klasse kann [alle]{.underline} Attribute und Methoden einer anderen Klasse \boldred{erben}. \pause \begin{tikzpicture} \begin{class}[text width=4cm]{Oberklasse}{0, 0} \end{class} \begin{class}[text width=4cm]{Unterklasse}{7, 0} \inherit{Oberklasse} \end{class} \end{tikzpicture} \pause Man spricht: Die *Unterklasse* erbt von der *Oberklasse*. \pause ### Beispiel \begin{tikzpicture} \begin{class}[text width=4cm]{Fahrzeug}{0, 0} \end{class} \begin{class}[text width=4cm]{Auto}{7, 0} \inherit{Fahrzeug} \end{class} \end{tikzpicture} *Ein Auto **erbt** von Fahrzeug* bzw. *ein Auto **ist** ein Fahrzeug*. ## \faIcon{pencil-alt} Vererbung in Java Um eine Vererbung auszudrücken wird in der Klassendefinition der **Unterklasse** `extends Oberklasse`{.java} ergänzt. Methoden und Attribute der Oberklasse können in der Unterklasse verwendet werden, als ob sie dort definiert sind. ::: {.columns} :::: {.column width=20%} ```java class Oberklasse { int zahl; Oberklasse() { zahl = 13; } } ``` :::: :::: {.column width=60%} ```java class Unterklasse extends Oberklasse { // zahl ist bereits in Oberklasse definiert Unterklasse() { // Aufruf des Konstruktors der Oberklasse super(); zahl = 12; } } ``` :::: ::: ## Vererbung - Generalisierung \begin{tikzpicture} \begin{class}[text width=4cm]{Rakete}{0, 0} \attribute{geschwindigkeit} \operation{bewegen()} \end{class} \begin{class}[text width=4cm]{Bus}{7, 0} \attribute{geschwindigkeit} \operation{bewegen()} \end{class} \end{tikzpicture} Gemeinsamkeiten mehreren Klassen in eine Oberklasse *auszulagern* nennt man \boldred{Generalisierung}. \pause \begin{tikzpicture} \begin{class}[text width=4cm]{Fahrzeug}{0, 2} \attribute{geschwindigkeit} \operation{bewegen()} \end{class} \begin{class}[text width=4cm]{Rakete}{7, 0} \inherit{Fahrzeug} \end{class} \begin{class}[text width=4cm]{Bus}{7, 2} \inherit{Fahrzeug} \end{class} \end{tikzpicture} ## \faIcon{desktop} Arbeitsauftrag - Rest der Stunde {.standout} \centering Tobt euch aus! Lasst Autos explodieren! Baut einen zweiten Spieler ein ...