Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

skript:vererbung

Dies ist eine alte Version des Dokuments!




Vererbung in Processing/Java

Voraussetzung für diese Aufgabe ist, dass ihr wisst, wie (und wofür) man eine einfache Klasse in Java schreibt.

Manchmal braucht man eine Weise, Objekte zu modellieren, die zum Teil gleiche und zum Teil abweichende Eigenschaften haben. Das kann man mit Hilfe der Vererbung machen. Unter diesem Konzept wird eine neue Klasse (erbende Klasse, Kindklasse, Unterklasse) von einer existierenden (Basisklasse, Elternklasse, Superklasse) abgeleitet und sie erweitert oder einschränkt.

Z.B. stellt euch vor, wir wollen ein Programm schreiben, welches alle 5 Sekunuden zufällig eine der drei geometrischen Figuren (Viereck, Dreieck, Kreis) erzeugt und ihre Fläche berechnet. Die Dimensionen der Figuren werden zufällig festgelegt. Die Figuren sollen sich auf gleicher Weise nach unten bewegen, bis sie unter der Zeichenfläche verschwinden (s. Abb.1).

Abbildung 1: Beispielprogramm auf der Zeichenfläche

Hier haben wir drei Objektarten, die zu einem Typ (geometrische Figur) gehören und gemeinsame Eigenschaften haben: ihre Bewegungsart sowie die Möglichkeit, ihre Fläche zu ermitteln. Methode für die Flächenberechnung und die Darstellung der Figuren auf dem Bildschirm unterscheiden sich jedoch. Um diese Beziehungen zu modellieren, werden wir eine Superklasse Shape und drei Unterklassen (Square, Triangle und Circle) anlegen.

Bei der Vererbung spricht man von einer “IS-A”-Beziehung. Jeder Square / Triangle / Circle ist [auch] eine 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.

// Klasse fuer geometrische Figuren (allgemein)
class Shape {
  int yPos; // y-Koordinate der Ecke oder des Zentrums
  float size; // Seitenlaenge oder Durchmesser
 
  // Konstruktor
  Shape(float size) {
    yPos = 0; // am Anfang auf 0 (ganz oben) setzen
    this.size = size;
  }
 
  // Zeichnet die Figur
  void display() {
    // tut nichts
  }
 
  // Bewegt die Figur
  void move() {
    yPos++;
  }
 
  // Berechnet die Flaeche der Figur
  float calculateArea() {
    return 0;
  }
}


Unterklassen ''Square'' und ''Triangle''

Jetzt legen wir die Unterklasse

Aufgabe: Unterklasse ''Circle''

Schreibt die Klasse Circle, welche von Shape erbt.

Musterlösung

Musterlösung

// Klasse fuer Kreise
class Circle extends Shape{
 
  // Konstruktor
  // yPos: y-Koordinate des Zentrums am Anfang
  // size: Durchmesser
  Circle(int yPos, float size) {
    super(yPos, size);
  }
 
  void display() {
    ellipse(width/2, yPos, size, size);
  }
 
  // Berechnet die Flaeche: F = (Durchmesser/2) zum Quadrat
  float calculateArea() {
    return sq(size/2.0) * PI;
  }
}
skript/vererbung.1538574056.txt.gz · Zuletzt geändert: 2018/10/03 15:40 von d.golovko