Interface Methode wird ungewollt in der Subklasse überschrieben

DiegoDre

Mitglied
Hey, ich benutze gerade zum ersten mal Interfaces, dabei ist folgendes Problem aufgetreten:
Ich habe eine Hauptklasse, welche ein Interface implementiert und dazu eine Subklasse. In der Subklasse soll die Methode draw, die zum Interface gehört erweitert werden, jedoch wird die Mehtode überschrieben statt erweitert. Fehlt mir etwas, habe ich ein Denkfehler, oder habe ich vllt etwas grundsätzlich falsch verstanden?

Hauptklasse:
Java:
public class EinfacheLandschaft implements Drawable  {
   
    protected Color land;
    protected Color himmel;
   
    /*Es folgen Konstruktoren und getter Methoden
    *...
    *...
    *...
    */
   
    public void draw(Graphics g) {
        g.setColor(himmel);
        Rectangle sky = new Rectangle(0,0, 800,285);
        g.fillRect(sky.x,sky.y,sky.width,sky.height);
        g.setColor(Color.black);
        g.drawLine(0, 285, 800, 285);
        g.setColor(land);
        Rectangle ground = new Rectangle(0,285, 800,285);
        g.fillRect(ground.x, ground.y,ground.width, ground.height);
    }

Subklasse:
Java:
public class Landschaft extends EinfacheLandschaft implements Drawable {
    protected int hügel;
    protected int bäume;
    Color darkGreen = new Color(0, 100, 0);
    protected Color baumkrone = darkGreen;
   
    /* Erweiterte Konstruktoren etc.
    *
    *
    *
    */
    public void draw(Graphics g) {
        Color land1 =land.darker();
        g.setColor(land1);
       
        for(int i = 0; i<hügel;i++) {
            int rX = randomNumberX();
            int rY = randomNumberY();

           
            Rectangle hügel = new Rectangle(rX,rY, 50,50);
            g.fillRect(hügel.x, hügel.y,hügel.width, hügel.height);
        }
         Color brown = new Color(165, 42, 42);
       
        for (int i = 0; i< bäume; i++) {
            g.setColor(brown);
            int rX = randomNumberX();
            int rY = randomNumberY();
           
            Rectangle stamm = new Rectangle(rX,rY, 10,30);
            g.fillRect(stamm.x, stamm.y,stamm.width, stamm.height);
           
            g.setColor(baumkrone);
            g.fillOval(rX-5, rY-15, 20,30);
        }
    }
 
Zuletzt bearbeitet:
Du kannst keine Methode erweitern nur überschreiben. Erweitern erreichst du, indem du super.draw(g); aufrufst, z.B.: am Beginn deiner Methode. Dann rufst du praktisch den Code der Super-Klasse auf und hängst deinen neuen Code hinten dran.
Java:
public void draw(Graphics g) {
    super.draw(g);
    
    // irgend etwas zusätzliches ....
}
 
In der Subklasse soll die Methode draw, die zum Interface gehört erweitert werden, jedoch wird die Mehtode überschrieben statt erweitert.
Ein Interface gibt normalerweise nur die Signatur der Methode vor und keine Implementation, die erweitert werden könnte. Eine Klasse, die ein Interface implementiert, muss die Implementation für alle im Interface geforderten Methode bereitstellen.

Edit: Hatte überlesen, dass es um die Subklasse ging, siehe Beitrag darüber 🙂
 
Java:
public class Landschaft extends EinfacheLandschaft implements Drawable {
Erzeugt eine Warnung - Redundant Super Interface - oder so ähnlich. EinfacheLandschaft implementiert das Interface schon, das ist also doppelt gemoppelt. Das ist aber nicht schlimm - wie gesagt nur eine Warnung.
 
Du kannst keine Methode erweitern nur überschreiben. Erweitern erreichst du, indem du super.draw(g); aufrufst, z.B.: am Beginn deiner Methode. Dann rufst du praktisch den Code der Super-Klasse auf und hängst deinen neuen Code hinten dran.
Java:
public void draw(Graphics g) {
    super.draw(g);
   
    // irgend etwas zusätzliches ....
}
DANKE!! Danach hab ich gesucht, dachte ich hätte es schon ausprobiert, hab aber scheibar was falsch gemacht. Vielen dank für die schnelle Antwort!
 
Nur noch als Hinweis.
Um Überschreiben durch Subklassen zu vermeiden, kann die Methode in der Hauptklasse als "final" deklariert werden.
 

Zurück
Oben