Inhaltsverzeichnis
Abstrakte Basisklassen und abstrakte Methoden
Im vorangegangenen Kapitel wurde die Methode zeitschritt()
von einer der von BewegtesObjekt
abgeleiteten Klassen überschrieben (Klasse SternNeu
). Die Klassen AutoNeu
und MotorradNeu
überschreiben die Methode nicht, sie behalten also die Methode der Basisklasse bei.
Oft kommt es vor, dass alle abgeleiteten Klassen eine gemeinsame Methode haben (und sie deshalb in die Basisklasse geschrieben wird), die Implementierung der Methode sich aber für alle abgeleiteten Klassen unterscheidet, so dass es nicht sinnvoll ist, die Methode in der Basisklasse zu implementieren. In diesem Fall kennzeichnet man sowohl die Basisklasse als auch die Methode als abstract
. Dies hat zur Folge, dass man die Methode in der Basisklasse nur deklarieren, aber nicht implementieren muss. Die abgeleiteten Klassen haben dann aber die Pflicht, diese Methode zu überschreiben.
Wir denken uns eine Methode kunststück()
, die die Klassen Auto
, Motorrad
und Stern
jeweils unterschiedlich implementieren.
Abstrakte Klasse BewegtesObjekt
public abstract class BewegtesObjekt { // Beginn der Klasse wie im vorigen Kapitel gezeigt. // Neu ist: abstract public void kunststück(); }
Klasse SternNeu
public class SternNeu extends BewegtesObjekt1 { public SternNeu(double x, double y){ super(x, y, Math.random() * 6 - 3, Math.random() * (-15) - 5, 0.3, "/vererbung/star.png"); } public void zeitschritt(){ vy += ay; if(sprite != null) { sprite.verschieben(vx, vy); sprite.drehen(vx*2); } } @Override public void kunststück() { sprite.animiereStreckung(1.5,800); } }
Klasse AutoNeu
public class AutoNeu extends BewegtesObjekt1 { public AutoNeu(double x, double y){ super(x, y, Math.random() * 3 +1, 0, 0, "/vererbung/car2.png"); } @Override public void kunststück() { sprite.animiereVerschiebung(0,-30,500); sprite.animiereVerschiebung(0,30,500).nach(500); } }
Klasse MotorradNeu
public class MotorradNeu extends BewegtesObjekt1 { public MotorradNeu(double x, double y){ super(x, y, Math.random() * 6 +2, 0, 0, "/vererbung/motorbike.png"); } @Override public void kunststück() { sprite.animiereDrehungImUhrzeigersinnUm(sprite.getMitteX(), sprite.getMitteY(), 70, 900); sprite.animiereDrehungImUhrzeigersinnUm(sprite.getMitteX(), sprite.getMitteY(), -70, 900).nach(1000); } }
Methode timerSignalVerarbeiten() in der Klasse AnimationStarter
@Override public void timerSignalVerarbeiten() { i++; if(i % 10 == 0){ figuren.add(new Stern1(300, 600)); figuren.add(new Auto1(0, Math.random() * 600)); figuren.add(new Motorrad1(0, Math.random() * 600)); } for(int i = 0; i < figuren.size(); i++){ BewegtesObjekt1 a = figuren.get(i); if(a.istAußerhalbDesFensters()){ figuren.remove(a); a.vernichten(); } a.zeitschritt(); if(Math.random() > 0.99){ // Neu: a.kunststück(); } } }