Benutzer-Werkzeuge

Webseiten-Werkzeuge


wiederholung:vererbung

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
wiederholung:vererbung [2022/12/09 07:37] – [Beispiel 1: Erweiterung der Buntstift-Klasse] Martin Pabstwiederholung:vererbung [2022/12/10 19:01] (aktuell) – [Beispiel 4: Feuerwerk] Martin Pabst
Zeile 127: Zeile 127:
  
 ==== Überschreiben von Methoden ==== ==== Überschreiben von Methoden ====
-{{ :klassen2:inheritance:pasted:20200510-110250.png}}+{{ :wiederholung:pasted:20221210-195623.png}}
 Die Methode ''public void schreibe(String text)'' hat **dieselbe Signatur** (d.h. Bezeichner, Parametertypen und Typ des Rückgabeparameters) **wie die gleichnamige Methode der Oberklasse** ''Buntstift''. Nach außen hin ist daher nur noch diese neue Methode sichtbar, nicht mehr die der Klasse ''Buntstift''. Man sagt: Die Methode **überschreibt** die gleichnamige Methode der Oberklasse. In der Methode selbst können wir die gleichnamige Methode der Oberklasse aber durchaus aufrufen. Dazu benutzen wir wieder das Schlüsselwort ''super'': Die Methode ''public void schreibe(String text)'' hat **dieselbe Signatur** (d.h. Bezeichner, Parametertypen und Typ des Rückgabeparameters) **wie die gleichnamige Methode der Oberklasse** ''Buntstift''. Nach außen hin ist daher nur noch diese neue Methode sichtbar, nicht mehr die der Klasse ''Buntstift''. Man sagt: Die Methode **überschreibt** die gleichnamige Methode der Oberklasse. In der Methode selbst können wir die gleichnamige Methode der Oberklasse aber durchaus aufrufen. Dazu benutzen wir wieder das Schlüsselwort ''super'':
  
Zeile 196: Zeile 196:
  
 === UML-Diagramm zu "Fliegende Rechtecke" === === UML-Diagramm zu "Fliegende Rechtecke" ===
-{{ :klassen2:inheritance:pasted:20200510-082627.png}}+{{ :wiederholung:pasted:20221210-195717.png}}
 Auf dem nebenstehenden Diagramm habe ich die (sehr zahlreichen!) Attribute und Methoden der Klassen ''Rectangle'', ''FilledShape'', ''Shape'' und ''Actor'' ausgeblendet, damit es übersichtlich bleibt. Die Vererbungshierarchie ist schön zu sehen:  Auf dem nebenstehenden Diagramm habe ich die (sehr zahlreichen!) Attribute und Methoden der Klassen ''Rectangle'', ''FilledShape'', ''Shape'' und ''Actor'' ausgeblendet, damit es übersichtlich bleibt. Die Vererbungshierarchie ist schön zu sehen: 
   * ''FlyingRectangle'' ist Unterklasse von ''Rectangle''   * ''FlyingRectangle'' ist Unterklasse von ''Rectangle''
Zeile 202: Zeile 202:
   * ''FilledShape'' ist Unterklasse von ''Shape''   * ''FilledShape'' ist Unterklasse von ''Shape''
   * ''Shape'' ist Unterklasse von ''Actor''   * ''Shape'' ist Unterklasse von ''Actor''
- 
-===== Aufgabe: Starfield ===== 
-{{ youtube>Uo28xYGLOO0?medium}} 
-Programmiere ein Sternenfeld, so wie es rechts im Video zu sehen ist: 
-  * Jeder Stern ist ein Kreis. 
-  * Jeder Stern besitzt eine Geschwindigkeit, mit der er von der Mitte der Welt nach außen fliegt. 
-  * Ist ein Stern außerhab des sichtbaren Bereichs (testbar mit der Methode ''isOutsideView()'' der Klasse ''Circle''), dann wird er vernichtet (Methode ''destroy()'' der Klasse ''Circle'') 
-  * Sterne werden größer, je länger sie schon fliegen. Dadurch entsteht der Effekt, dass sie "näher" kommen. 
-<HTML><div style="clear: both;"></div></HTML> 
- \\  
  
 <HTML> <HTML>
-<div class="java-online" style="height620px; width: 100%data-java-online="{'withBottomPanel': true, 'id': 'Vererbung4'}"> +<div style="clearboth"></div>
- +
-<script type="text/plain" title="Starfield.java"> +
-// Hier programmieren! +
-</script> +
- +
-<script type="text/plain" title="Tipp 1" data-type="hint"> +
-## Tipp 1: +
-Ein Stern ist ein Kreis. Die Klasse ``Stern`` sollte also Unterklasse der Klasse ``Kreis`` sein. Zudem hat jeder Stern - wie die fliegenden Rechtecke im Bild oben - eine Geschwindigkeit. +
-</script> +
- +
- +
-<script type="text/plain" title="Tipp 2" data-type="hint"> +
-## Tipp 2: +
-Hier ein "Gerüst" für das Programm: +
-``` +
-new World(800, 800); +
-new Star(400, 400); +
- +
- +
-class Star extends Circle { +
-     double vx; +
-     double vy; +
- +
-   public Star(double x, double y) { +
-      super(x, y, 1); +
-   } +
-    +
-   public void act() { +
-     // Alle Anweisungen hier werden 30-mal pro Sekunde ausgeführt +
-   } +
- +
-+
-``` +
-</script> +
-<script type="text/plain" title="Tipp 3" data-type="hint"> +
-## Tipp 3: +
-Die Geschwindigkeit der Sterne in x- und y-Richtung ist zufällig. Eine Zufallszahl zwischen bspw. 2 und 10 erzeugt man folgendermaßen: +
-``` +
-vx = Math.randdouble(2, 10); +
-vy = Math.randdouble(2, 10); +
-``` +
- +
-</script> +
-<script type="text/plain" title="Tipp 4" data-type="hint"> +
-## Tipp 4: +
-Die Methode ``act()`` ist sehr ähnlich zur gleicnamigen Methode im Beispiel "Fliegende Rechtecke"+
-</script> +
-<script type="text/plain" title="Tipp 5" data-type="hint"> +
-## Tipp 5: +
-Die Formel zur zufälligen Bestimmung der Geschwindigkeit in Tipp 3 hat einen Nachteil: Die Geschwindigkeiten haben nicht nur verschiedene Richtungen (gut!) sondern auch sehr unterschiedliche Beträge (schlecht!), d.h. die Sterne fliegen unterschiedlich schnell. Viel besser ist es, mit **Poloarkoordinaten** zu arbeiten, das heißt: Wir bestimmen zuerst den Betrag ``v`` der Geschwindigkeit zufällig, dann den Winkel ``w`` (also ihre Richtung). Danach berechnen wir aus ``v``und ``w`` die benötigten Komponenten ``vx``und ``vy``. +
-``` +
-double v = Random.randdouble(2, 10); // Betrag der Geschwindigkeit zwischen 2 und 10 +
-double w = Random.randdouble(0, 2*Math.PI); // Winkel zwischen 0 und 2*PI +
-vx = v * Math.cos(w); +
-vy = v * Math.sin(w); +
-``` +
- +
-</script> +
- +
-</div> +
 </HTML> </HTML>
  
-[[.starfieldloesung:start|Lösung zur Aufgabe "Starfield"]] 
  
 ====== Beispiel 3: Klasse "Raute" ====== ====== Beispiel 3: Klasse "Raute" ======
Zeile 284: Zeile 212:
  
 ==== Skizze: ==== ==== Skizze: ====
-{{ :klassen2:inheritance:pasted:20201213-214225.png?500 }}+{{ :wiederholung:pasted:20221210-195858.png?500 }}
 <HTML> <HTML>
  
Zeile 321: Zeile 249:
  
 ==== Mathematische Grundlagen ==== ==== Mathematische Grundlagen ====
-{{ :klassen2:inheritance:stern-erklaerung.png?600}}+{{ :wiederholung:pasted:20221210-195939.png?600}}
  
 Wir wollen einen Stern mit $n$ Außenzacken zeichnen. Dazu brauchen wir die Koordinaten $(mitte_{x}, mitte_{y})$ seines Mittelpunkts, den Außenradius $r_{außen}$ (d.h. den Abstand der äußeren Zacken vom Mittelpunkt) und den Innenradius $r_{innen}$ (d.h. den Abstand der inneren Zacken des Sterns vom Mittelpunkt). \\ Wir wollen einen Stern mit $n$ Außenzacken zeichnen. Dazu brauchen wir die Koordinaten $(mitte_{x}, mitte_{y})$ seines Mittelpunkts, den Außenradius $r_{außen}$ (d.h. den Abstand der äußeren Zacken vom Mittelpunkt) und den Innenradius $r_{innen}$ (d.h. den Abstand der inneren Zacken des Sterns vom Mittelpunkt). \\
Zeile 372: Zeile 300:
  
 === UML-Diagramm zu "Stern" === === UML-Diagramm zu "Stern" ===
-{{ :klassen2:inheritance:pasted:20200517-215226.png}}+{{ :wiederholung:pasted:20221210-200031.png}}
 Auf dem nebenstehenden Diagramm habe ich die (sehr zahlreichen!) Attribute und Methoden der Klassen ''Polygon'', ''FilledShape'', ''Shape'' und ''Actor'' ausgeblendet, damit es übersichtlich bleibt. Die Vererbungshierarchie ist schön zu sehen:  Auf dem nebenstehenden Diagramm habe ich die (sehr zahlreichen!) Attribute und Methoden der Klassen ''Polygon'', ''FilledShape'', ''Shape'' und ''Actor'' ausgeblendet, damit es übersichtlich bleibt. Die Vererbungshierarchie ist schön zu sehen: 
   * ''Stern'' ist Unterklasse von ''Polygon''   * ''Stern'' ist Unterklasse von ''Polygon''
Zeile 432: Zeile 360:
 </HTML> </HTML>
  
-===== Feuerwerk ===== +====== Beispiel 5: Feuerwerk ====== 
-Das Beispiel "Feuerwerk[[:api:documentation:grafik:animation#beispiel_4feuerwerk|findest Du hier]].+Dieses Beispiel habe ich als Wiederholungsübung für meine zehnten Klassen im Schuljahr 2020/21 geschrieben. Damals war wegen er Corona-Epidemie das Sylvesterfeuerwerk ausgefallen. 
 +{{ youtube>4OY-p4M4hpY?large }} 
 +<HTML> 
 +<div class="java-onlinestyle="height600px; width100%" data-java-online="{'withBottomPanel'false, 'id''Feuerwerk', 'speed': 'max'}"> 
 +<script type="text/plain" title="Feuerwerk.java"> 
 +new Feuerwerk();
  
 +class Feuerwerk extends Actor {
 +   
 +   public void act() {
 +      if(Math.random() < 0.03) {
 +         
 +         int funkenzahl = Math.floor(Math.random() * 50 + 30);
 +         int farbe = Color.randomColor(128);
 +
 +         double x = Math.random() * 400 + 200;
 +         double y = Math.random() * 600;
 +         double lebensdauer = 60 + Math.random() * 60;
 +         for(int i = 0; i < funkenzahl; i++) {
 +            new Funke(x, y, farbe, lebensdauer);
 +         }
 +         Sound.playSound(Sound.cannon_boom);
 +
 +      }
 +   }
 +
 +}
 +
 +class Funke extends Circle {
 +   double vx;
 +   double vy;
 +   double lebensdauer;           // lebensdauer in 1/30 s
 +
 +   Funke(double x, double y, int farbe, double lebensdauer) {
 +      super(x, y, 4);
 +      double winkel = Math.random() * 2 * Math.PI;
 +      double v = Math.random() * 15 + 5;
 +      vx = v * Math.cos(winkel);
 +      vy = v * Math.sin(winkel);
 +      setFillColor(farbe);
 +      this.lebensdauer = lebensdauer;
 +   }
 +
 +   public void act() {
 +      lebensdauer--;
 +      move(vx, vy);
 +      vy = vy + 0.2;
 +      if(lebensdauer < 30) {
 +         setAlpha(lebensdauer / 30);
 +      }
 +      if(isOutsideView() || lebensdauer < 0) {
 +         destroy();
 +      }
 +   }
 +
 +}
 +</script>
 +</div>
 +</HTML>
wiederholung/vererbung.1670571425.txt.gz · Zuletzt geändert: 2022/12/09 07:37 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki