====== 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(); } } }