Figuren

 

Auch das  Applet "Figuren" veranschaulicht die Möglichkeiten objektorientierten Programmierens. Hier werden geometrische Objekte (Bälle und Rechtecke) erzeugt, die durch Anklicken mit der Maus aktiviert bzw. deaktiviert werden können. Aktivierte Figuren lassen sich mit den Pfeiltasten bewegen. Kreise und Rechtecke sind beides geometrische Figuren. Also liegt es nahe, Kreise und Rechtecke als Unterklassen einer Klasse Figur zu definieren. Man kann von dieser Oberklasse Figur allerdings - anders als bei Ball und Billardball im letzten Beispiel - keine Objekte erzeugen, denn eine Figur kann entweder ein Kreis oder ein Rechteck (man sagt, eine Variable der Klasse Figur ist polymorph, vielgestaltig) sein aber nicht beides gleichzeitig. Was würde ich also erzeugen, wenn ich ein Figurobjekt erzeugen könnte? Damit von der Klasse Figur kein Objekt erzeugt werden kann, definiere ich die Klasse als abstrakt (Schlüsselwort abstract). Eine Figur sollte auch gezeichnet werden können. Da es aber durchaus unterschiedlicher Befehle bedarf, um einen Kreis oder ein Rechteck zu zeichnen, bleibt die Methode zeichnen der Klasse Figur leer (auch das wird mit dem Schlüsselwort abstract erreicht).

public abstract class Figur {
    private Color hasColor;
    private int zX, zY;
    private int zWidth;
    private boolean zActive;
    private boolean zVisible;
    
    public Figur(int pX, int pY,int pWidth, Color pColor){
        zX=pX;zY=pY;zWidth=pWidth;
        zActive=false;
        zVisible=true;
        hasColor=pColor;
    }
    
    public void setX(int pX){
        zX=pX;
    }
    
    public void setY(int pY){
        zY=pY;
    }
    
    public void setWidth(int pWidth){
        zWidth=pWidth;
    }
    
    public void setActive(){
        zActive=true;
    }
    
    public void setInactive(){
        zActive=false;
    }
    
    public void setVisible(){
        zVisible=true;
    }
    
    public void setInvisible(){
        zVisible=false;
    }
    
    public void setColor(Color pColor){
        hasColor=pColor;
    }
    
    public int getX(){
        return zX;
    }
    
    public int getY(){
        return zY;
    }
    
    public int getWidth(){
        return zWidth;
    }
    
    public boolean getActive(){
        return zActive;
    }
    
    public boolean getVisible(){
        return zVisible;
    }
    
    public Color getColor(){
        return hasColor;
    }
    
    public void move(Graphics pG, int pX, int pY){
        clear(pG);
        zX+=pX;
        zY+=pY;
        pause(20);
        paint(pG);
    }
    protected void pause(int ms){
        try {
            Thread.sleep(ms);
        }
        catch(InterruptedException e){}
    }
    
    public abstract void paint(Graphics pG);
    public abstract void clear(Graphics pG);
    public abstract boolean hit(int pX, int pY);
}