Benutzer-Werkzeuge

Webseiten-Werkzeuge


skript:vererbung

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
skript:vererbung [2018/10/04 21:52]
d.golovko [Unterklassen ''Square'' und ''Triangle'']
skript:vererbung [2018/10/04 22:10] (aktuell)
d.golovko
Zeile 18: Zeile 18:
 ====Superklasse ''​Shape''​==== ====Superklasse ''​Shape''​====
  
-Als Erstes legen wir die Klasse ''​Shape''​ an. Eine ''​Shape''​ muss drei Dinge können: sich zeichnen (''​display()''​),​ sich bewegen (''​move()''​) und die eigene Fläche berechnen (''​calculateArea()''​). Die Bewegung wird so realisiert, dass bei jedem Aufruf der ''​move()''​-Methode die y-Koordinate (die Objektvariable ''​yPos''​) verändert wird. Die Methoden ''​display()''​ und ''​calclateArea()''​ können wir noch nicht sinnvoll implementieren,​ da sie nicht einheitlich für alle Figuren sind. //​Geschickter wäre es, sie als abstrakte Methoden zu schreiben, d.h. Methoden, die in der Elternklasse nur deklariert und erst in den Unterklassen implementiert werden. Einfachheitshalber verzichten wir darauf; Wenn ihr Interesse habt, lesst den letzten Kapitel auf dieser Seite//.+Als Erstes legen wir die Klasse ''​Shape''​ an. Eine ''​Shape''​ muss drei Dinge können: sich zeichnen (''​display()''​),​ sich bewegen (''​move()''​) und die eigene Fläche berechnen (''​calculateArea()''​). Die Bewegung wird so realisiert, dass bei jedem Aufruf der ''​move()''​-Methode die y-Koordinate (die Objektvariable ''​yPos''​) verändert wird. Die Methoden ''​display()''​ und ''​calclateArea()''​ können wir noch nicht sinnvoll implementieren,​ da sie nicht einheitlich für alle Figuren sind. //​Geschickter wäre es, sie als abstrakte Methoden zu schreiben. Einfachheitshalber verzichten wir darauf; Wenn ihr Interesse habt, lesst den letzten Kapitel auf dieser Seite//.
  
 <code java> <code java>
Zeile 86: Zeile 86:
 </​code>​ </​code>​
  
-Jetzt erscheint "​25.0"​ auf der Konsole. Also: wenn eine Methode mit der gleichen Signatur (d.h. mit gleichem Namen und Parametern) in der Unterklasse vorhanden ist, //​überschreibt//​ (Englisch: //​overrides//​) diese die Methode aus der Superklasse. Auf dieser Weise kann man die Eigenschaften einer existierenden Klasse an den notwendigen Stellen modifizieren. Dadurch kann man logische Zusammenhänge zwischen den Klassen hervorheben und weniger Redundanz im Code haben. ​+Jetzt erscheint "​25.0"​ auf der Konsole. Statt ''​Shape.calculateArea()''​ wurde ''​Square.calculateArea()''​ ausgeführt. Also: wenn eine Methode mit der gleichen Signatur (d.h. mit gleichem Namen und Parametern) in der Unterklasse vorhanden ist, //​überschreibt//​ (Englisch: //​overrides//​) diese die Methode aus der Superklasse. Auf dieser Weise kann man die Eigenschaften einer existierenden Klasse an den notwendigen Stellen modifizieren. Dadurch kann man logische Zusammenhänge zwischen den Klassen hervorheben und weniger Redundanz im Code haben. ​
  
 Schließlich müssen wir noch festlegen, wie die Vierecke gezeichnet werden sollen -- in der Methode ''​display()''​. Die Methode ''​move()''​ wird gleich bleiben für alle Unterklassen,​ wir müssen sie nicht überschreiben. Schließlich müssen wir noch festlegen, wie die Vierecke gezeichnet werden sollen -- in der Methode ''​display()''​. Die Methode ''​move()''​ wird gleich bleiben für alle Unterklassen,​ wir müssen sie nicht überschreiben.
Zeile 154: Zeile 154:
  
  
-====Aufgabe: Unterklasse ''​Circle''​====+====Übung: Unterklasse ''​Circle''​====
  
 Schreibt die Klasse ''​Circle'',​ welche von ''​Shape''​ erbt.  Schreibt die Klasse ''​Circle'',​ welche von ''​Shape''​ erbt. 
  
-<​hidden ​Musterlösung>+Musterlösung:​ {{:​skript:​inheritance_three_figures2.zip|}} 
 + 
 + 
 +====Nachtrag:​ abstrakte Methoden==== 
 + 
 +Abstrakte Methoden sind Methoden, die in der Elternklasse nur deklariert und erst in den Unterklassen implementiert werden. Dafür eignet sich unser Beispiel ganz gut, denn ''​display()''​ und ''​calculateArea()''​ können auf der Ebene der ''​Shape''​ nicht implementiert werden. Solche Methoden werden mit dem Schlüsselwort ''​abstract''​ gekennzeichnet und haben keinen Methodenkörper. Eine Klasse mit einer oder mehreren abstrakten Methoden ist eine abstrakte Klasse. Solche Klassen dürfen nicht instanziiert werden, d.h. man kann keine Objekte von diesem Typ erzeugen.  
 + 
 +<​hidden ​Abstrakte Klasse Shape>
 <code java> <code java>
-// Klasse fuer Kreise +// Klasse fuer geometrische Figuren (allgemein) 
-class Circle extends ​Shape{ +abstract ​class Shape { 
-   + 
-  // Konstruktor +  ​int yPos; // y-Koordinate ​der Ecke oder des Zentrums 
-  // yPos: y-Koordinate des Zentrums ​am Anfang +  ​float size; // Seitenlaenge oder Durchmesser 
-  // size: Durchmesser + 
-  ​Circle(int yPos, float size) { +  ​Shape(float size) { 
-    ​super(yPos, size);+    yPos = 0; // am Anfang auf 0 (ganz obensetzen 
 +    this.size = size;
   }   }
-  ​ + 
-  void display() { +  ​// Zeichnet die Figur 
-    ellipse(width/​2,​ yPos, size, size); +  abstract ​void display();​ 
-  } + 
-  ​ +  // Bewegt ​die Figur 
-  // Berechnet ​die Flaeche: F = (Durchmesser/​2) zum Quadrat +  ​void move() { 
-  ​float calculateArea() { +    ​yPos++;
-    ​return sq(size/​2.0) * PI;+
   }   }
 +
 +  // Berechnet die Flaeche der Figur
 +  abstract float calculateArea();​
 } }
 </​code>​ </​code>​
 </​hidden>​ </​hidden>​
- 
  
  
skript/vererbung.1538682761.txt.gz · Zuletzt geändert: 2018/10/04 21:52 von d.golovko