g9:uebungen:vererbung:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
g9:uebungen:vererbung:start [2021/01/20 17:47] – angelegt Martin Pabst | g9:uebungen:vererbung:start [2022/07/01 07:46] (aktuell) – [Beispiel 7: Fraktaler Baum] Martin Pabst | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Vererbung ====== | ====== Vererbung ====== | ||
- | Wir haben Klassen bisher als Mittel zur Schaffung übersichtlichen Codes kennengelernt: Mit ihrer Hilfe werden zusammmengehörige Daten gebündelt und mit den Methoden verwoben, die auf ihnen operieren. In diesem Kapitel lernen wir, wie Klassen uns helfen, Doppelungen im Code zu vermeiden. Sie helfen uns, bereits existierenden Code - auch den anderer Programmierer - einfach zu erweitern. | + | ====== Beispiel 1: Advanced Robot ====== |
- | ====== Beispiel 1: Erweiterung der Buntstift-Klasse ====== | + | <WRAP center round todo 80%> |
- | Erinnert Ihr Euch an die Buntstift-Klasse | + | Die Klasse |
+ | * Die Methode '' | ||
+ | * Die Methode '' | ||
+ | * Die Methode '' | ||
+ | * Die Methode | ||
+ | * Die Methode | ||
- | {{ youtube> | + | Lass Dir noch weitere Methoden einfallen und schreibe ein Hauptprogramm, |
- | \\ \\ | + | |
- | + | ||
- | <WRAP center round info 60%> | + | |
- | Warum stellen wir die erschwerende Forderung an uns, die Klasse '' | + | |
- | - Oft haben wir den Quelltext für existierende Klassen nicht, da sie Bestandteil großer kommerzieller Bibliotheken sind oder zur API der Programmiersprache gehören und vielleicht in einer anderen (maschinnennaheren und damit schnelleren) Programmiersprache implementiert sind. | + | |
- | - Selbst wenn wir den Quelltext einer Bibliothek haben, möchten wir in ihn nicht eingreifen, da wir sonst im Falle eines Updates der Bibliothek deren neuen Quelltext wieder von Neuem verändern müssten. | + | |
- | - Stellt Euch vor, wir wollen zusätzlich zur Klasse '' | + | |
</ | </ | ||
- | |||
- | In einem ersten Schritt erstellen wir die Klasse '' | ||
- | <code learnj> | ||
- | class StiftNeu extends Buntstift { | ||
- | } | ||
- | </ | ||
< | < | ||
- | <div class=" | + | <div class=" |
- | <script type=" | + | <script type=" |
- | StiftNeu stift = new StiftNeu(Color.red); | + | AdvancedRobot tom = new AdvancedRobot(1, 1, 10, 10); |
- | stift.schreibe("Hallo Welt"); | + | tom.legeQuadrat(4); |
+ | tom.baueTreppe(3); | ||
- | class StiftNeu | + | class AdvancedRobot |
+ | |||
+ | void umdrehen() { | ||
+ | linksDrehen(); | ||
+ | linksDrehen(); | ||
+ | } | ||
- | } | + | void gehe(int schrittzahl) |
- | + | for (int i = 0; i < schrittzahl; | |
- | class Buntstift | + | schritt(); |
- | + | | |
- | Color farbe; | + | |
- | + | ||
- | | + | |
- | | + | |
} | } | ||
- | public | + | |
- | | + | |
+ | | ||
+ | | ||
+ | } | ||
} | } | ||
- | }</ | + | void legeQuadrat(int seitenlänge) { |
- | + | for (int s = 0; s < 4; s++) { | |
- | </ | + | legeBahn(seitenlänge); |
- | + | linksDrehen(); | |
- | </ | + | |
- | * Führe das Programm Schrittweise mit "step into ({{: | + | |
- | * Lass die Maus auf den Bezeichner '' | + | |
- | + | ||
- | <WRAP center round info 60%> | + | |
- | Mithilfe des Schlüsselwortes '' | + | |
- | <code learnj [enable_line_numbers=" | + | |
- | class StiftNeu extends Buntstift | + | |
- | + | ||
- | } | + | |
- | </ | + | |
- | dafür, dass die Klasse '' | + | |
- | Die neue Klasse, die von der bestehenden Klasse erbt, nennt man **Unterklasse**, | + | |
- | </ | + | |
- | + | ||
- | Wir haben bisher also eine " | + | |
- | + | ||
- | < | + | |
- | <div class=" | + | |
- | <script type=" | + | |
- | StiftNeu stiftGroß = new StiftNeu(Color.red, | + | |
- | stiftGroß.schreibe(" | + | |
- | + | ||
- | StiftNeu stiftKlein = new StiftNeu(Color.lime, false); | + | |
- | stiftKlein.schreibe("Hallo Welt"); | + | |
- | + | ||
- | class StiftNeu extends Buntstift { | + | |
- | + | ||
- | | + | |
- | + | ||
- | | + | |
- | | + | |
- | this.großschreibung = großschreibung; | + | |
} | } | ||
- | public | + | |
- | | + | |
- | text = text.toUpperCase(); | + | legeBahn(höhe - i); |
+ | | ||
+ | | ||
+ | | ||
} | } | ||
- | super.schreibe(text); | ||
} | } | ||
} | } | ||
</ | </ | ||
- | <script type=" | ||
- | class Buntstift { | ||
- | |||
- | Color farbe; | ||
- | |||
- | | ||
- | farbe = farbe1; | ||
- | } | ||
- | |||
- | | ||
- | println(text, | ||
- | } | ||
- | |||
- | }</ | ||
- | |||
- | </ | ||
- | |||
</ | </ | ||
- | Da hab' ich Euch jetzt viel Neues zugemutet. Wir gehen alles schrittweise durch: | ||
- | |||
- | ==== Aufruf des Konstruktors der Oberklasse ==== | ||
- | Schauen wir uns den Konstruktor der Klasse '' | ||
- | <code learnj [enable_line_numbers=" | ||
- | | ||
- | super(farbe); | ||
- | this.großschreibung = großschreibung; | ||
- | } | ||
- | </ | ||
- | Da '' | ||
- | <WRAP center round info 60%> | ||
- | In Java **muss** jeder Konstruktor einer Unterklasse als **erste** Anweisung den Aufruf eines Konstruktors der Oberklasse enthalten. Dies wird mithilfe des Schlüsselwortes '' | ||
- | </ | ||
- | |||
- | ==== Überschreiben von Methoden ==== | ||
- | {{ : | ||
- | Die Methode '' | ||
- | |||
- | <code learnj [enable_line_numbers=" | ||
- | | ||
- | if(großschreibung) { | ||
- | text = text.toUpperCase(); | ||
- | } | ||
- | super.schreibe(text); | ||
- | } | ||
- | </ | ||
- | |||
- | * Führe das Programm oben wieder schrittweise mit "step into ({{: | ||
- | |||
- | ==== UML-Diagramm ==== | ||
- | Rechts siehst Du das UML-Diagramm der Klassen. Die Vererbung wird durch eine Linie von '' | ||
- | **Erinnerung: | ||
- | |||
- | ====== Fachbegriffe ====== | ||
- | {{ youtube> | ||
====== Beispiel 2: Fliegende Rechtecke ====== | ====== Beispiel 2: Fliegende Rechtecke ====== | ||
- | {{ youtube> | ||
Starte das Programm und regle die Geschwindigkeit langsam hoch! | Starte das Programm und regle die Geschwindigkeit langsam hoch! | ||
< | < | ||
Zeile 160: | Zeile 73: | ||
new FlyingRectangle(); | new FlyingRectangle(); | ||
} | } | ||
- | |||
- | |||
class FlyingRectangle extends Rectangle { | class FlyingRectangle extends Rectangle { | ||
Zeile 191: | Zeile 102: | ||
</ | </ | ||
- | Damit die Seite nicht zu lange wird, findest Du die [[.flyingRectangle: | + | Damit die Seite nicht zu lange wird, findest Du die [[: |
=== UML-Diagramm zu " | === UML-Diagramm zu " | ||
Zeile 277: | Zeile 188: | ||
</ | </ | ||
- | [[.starfieldloesung: | + | [[: |
====== Beispiel 3: Klasse " | ====== Beispiel 3: Klasse " | ||
Zeile 431: | Zeile 342: | ||
</ | </ | ||
- | ===== Feuerwerk ===== | + | ===== Beispiel 5: Feuerwerk ===== |
Das Beispiel " | Das Beispiel " | ||
+ | |||
+ | ====== Beispiel 6: Kochkurve ====== | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new World(1000, 1000); | ||
+ | Kochkurve k = new Kochkurve(7); | ||
+ | |||
+ | class Kochkurve extends Turtle { | ||
+ | |||
+ | | ||
+ | super(50, 700); | ||
+ | setBorderWidth(3); | ||
+ | int länge = 700; | ||
+ | turn(60); | ||
+ | zieheLinie(länge, | ||
+ | turn(-120); | ||
+ | zieheLinie(länge, | ||
+ | turn(-120); | ||
+ | zieheLinie(länge, | ||
+ | } | ||
+ | |||
+ | | ||
+ | if(tiefe == 0) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | zieheLinie(länge / 3, tiefe - 1); | ||
+ | turn(60); | ||
+ | zieheLinie(länge / 3, tiefe - 1); | ||
+ | turn(-120); | ||
+ | zieheLinie(länge / 3, tiefe - 1); | ||
+ | turn(60); | ||
+ | zieheLinie(länge / 3, tiefe - 1); | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ====== Beispiel 7: Fraktaler Baum ====== | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new FraktalerBaum(400, | ||
+ | |||
+ | class FraktalerBaum extends Turtle { | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | super(x, y); | ||
+ | this.faktor = faktor; | ||
+ | this.winkel = winkel; | ||
+ | setBorderWidth(2); | ||
+ | turn(90); | ||
+ | zeichneAst(tiefe, | ||
+ | } | ||
+ | |||
+ | void zeichneAst(int n, double länge) { | ||
+ | if(n == 0) return; | ||
+ | |||
+ | forward(länge); | ||
+ | turn(winkel); | ||
+ | zeichneAst(n - 1, länge * faktor); | ||
+ | turn(-2*winkel); | ||
+ | zeichneAst(n - 1, länge * faktor); | ||
+ | turn(winkel); | ||
+ | turn(180); | ||
+ | penUp(); | ||
+ | forward(länge); | ||
+ | turn(180); | ||
+ | penDown(); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ |
g9/uebungen/vererbung/start.1611161274.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)