===== Vererbung ===== Angenommen ein Programm für einen Gebrauchtwagenhändler soll erstellt werden. Da sehr unterschiedliche Fahrzeugtypen verwaltet werden sollen, soll auch für jeden Typ eine eigene Klasse erstellt werden. Unmittelbar klar ist jedoch auch, dass die Fahrzeuge einige Gemeinsamkeiten haben. (Fahrgestellnr, Vorbesitzer, Preis, TÜV, ASU, Steuerklasse, ...) Damit diese Gemeinsamkeiten nicht für jede Fahrzeugtypklasse neu erstellt werden müssen, kann zunächst eine (Ober-)Klasse ''fahrzeug'' erstellt werden, die genau diese Gemeinsamkeiten schon beinhaltet. Beim Erstellen einer neuen (Unter-)Klasse ''transporter'' wird angegeben, dass sie die (Ober-)Klasse ''fahrzeug'' beerbt. Nun werden sämtliche Attribute und Methoden dieser Klasse vererbt und müssen nicht nochmal implementiert werden. Neue Attribute und neue Methoden können in gewohnter Weise zugefügt werden. ===== Der Maulwurf ===== --- Fortsetzung des Beispiels Schildkröte aus [[oop-Objekte|Objekte]]. --- Möchte man ein Tier haben, dass sich auch fortbewegen kann, ohne zu zeichnen, gibt es mindestens folgende zwei Möglichkeiten: * Man fügt der Klasse Schildkröte eine Methode ''springe'' hinzu, die dasselbe macht wie ''gehe'' - nur eben nicht zeichnen. * Man schreibt eine neue Klasse ''Maulwurf'' mit einer neuen Methode, die dasselbe macht wie ''gehe'' - nur wiederum nicht zeichnen. Allerdings wird alles andere von der Klasse Schildkröte ''geerbt''. Die erste Möglichkeit ist vermutlich die einfachere. Jedoch soll hier die zweite behandelt werden, um das Prinzip der **Vererbung** der objektorientierten Programmierung kennen zu lernen. * Zunächst wird eine neue Java-Klasse angelegt, die ''Maulwurf'' heißt. * Diese Klasse erbt bzw. erweitert (extends) alle Attribute und Merhoden von ''Schildkröte''. - Nur der Konstruktor wird nicht vererbt. * Daher muss der Konstruktor und natürlich alle neuen Dinge neu geschrieben werden. Wichtig: * Die Oberklasse //muss// keinen leeren Konstruktor anbieten. Tut sie dies auch nicht, muss in der Unterklasse aber der Konstruktor der Oberklasse aufgerufen werden. Dies geschieht mit ''super(...)''. Dies ist sogar ganz praktisch, da man wieder doppelten Quelltext vermeiden kann. package Zeichnen; import java.awt.Graphics; /** * * @author euteneuer */ public class Maulwurf extends Schildkröte{ public Maulwurf (double x, double y, double winkel, Graphics g) { super (x, y, winkel, g); } public void grabe (double weite) { double dx = (double)(weite*Math.sin(bogenmaß)); double dy = (double)(weite*Math.cos(bogenmaß)); double xNeu = x+dx; double yNeu = y+dy; x = xNeu; y = yNeu; } } Folgende Attribute besitzt ''Maulwurf'': double winkel; double bogenmaß=0; double x, y; Graphics g; Folgende Methoden besitzt nun ''Maulwurf'': public void setY (double y) public void setWinkel (double winkel) public void gehe (double weite) public void dreheLinks (double winkel) public void dreheRechts (double winkel) public double getX () public double getY () public double getWinkel () public Graphics getGraphics () public void grabe (double weite) ===== Den Maulwurf verwenden ===== Die folgende Methode zeichnet ebenfalls ein Quadrat. Allerdings sind die Kanten doppelt so lang (warum wohl??) und gestrichelt. private void bZeichneActionPerformed(java.awt.event.ActionEvent evt) { Maulwurf gertrude; gertrude= new Maulwurf (200 , 200 , 90 , pZeichenbrett.getGraphics()); for (int i=1; i<=4; i++) { for (int k=1; k<=6; k++) { gertrude.gehe(5); gertrude.grabe(5); } fabian.dreheLinks(90); } }