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();
            }
        }
    }
Drucken/exportieren
QR-Code
QR-Code schule:klassen:2017:10b:kap12 (erstellt für aktuelle Seite)