Vererbung Wie auf Variablen der Superklasse zugreifen?

asyoulikeit

Mitglied
Hallo,

ich habe mal wieder ein Java-Anfänger Problem. Thema ist diesmal Vererbung.

Gegeben sind mir folgende drei Klassen:

Java:
public class Punkt {
    
    public final double x;
    public final double y;

    public Punkt(double x, double y) {
        this.x = x;
        this.y = y;
    }

... und ein paar Methoden

Java:
public class Vektor {


    public final Punkt origin;
    public final double length;
    public final double angle;
    public final Punkt tip;

    public Vektor(Punkt origin, double length, double angle) {
        this.origin = origin;
        this.length = Math.abs(length);  
        this.angle =  (length > 0) ? angle : addAngles(angle, 180);
        tip = (new Punkt(origin.x + length, origin.y + 0)).rotate(angle, origin);
    }

... auch hier ein paar Methoden

Java:
public class Form {

    private Punkt origin;
    private double angle;
     
    public Form(Punkt origin, double angle) {
        this.origin = origin;
        this.angle = angle;
    }

    public Form(Punkt origin) {
        this(origin, 0);
    }

... und hier ebenfalls.

Ich soll jetzt dazu eine Klasse Rechteck schreiben, die von Form erbt und verschiedenes berechnet, wie Umfang, Fläche und Eckpunkte
Gegeben ist der Mittelpunkt, Länge und Breite (später auch der Winkel zur x-Achse, aber den lass ich jetzt erstmal außen vor)

Mein Problem ist jetzt, dass ich nicht weiß, wie ich an die x und y Werte des Mittelpunkts komme. Bisher habe ich dieses hier:

Java:
public class Rechteck extends Form {

    private double height;
    private double width;

    public Rechteck(Punkt origin, double width, double height, double angle) {
        super(origin, angle);
        this.width = width;
        this.height = height;
    }

    public Rechteck (Punkt origin, double width, double height) {
        super(origin);
        this.width = width;
        this.height = height;
    }

    public double width() {
		return width;
	}

    public double heigth() {
		return height;
	}

    public Punkt punktA() {
		Punkt punktA = new Punkt(x - (width / 2), y - (height / 2));
		return punktA;
	}

usw. usw.

Und genau hier hakt es. Egal was ich versuche (x, origin.x, Rechteck.x, origin(x)), ich bekomme immer ein "cannot find symbol".
Wie muss ich x und y ansprechen? Ach ja, Getter und Setter darf ich nicht verwenden.
Wäre super, wenn mir hier jemand weiterhelfen könnte.
 
"origin" in Form ist private. Damit die Subklassen darauf zugreifen können, muss es entweder protected oder public sein - oder du brauchst eine get-Methode dafür.
 
Zuletzt bearbeitet:
Das kannst du nicht. [c]origin[/c] ist
Code:
private
in Form, d.h. keine andere Klasse kann darauf zugreiffen (ergo wird sie auch nicht vererbt). Wenn du sie
Code:
protected
machst, kann die Tochterklasse darauf zugreiffen.

[EDIT]da war wohl jemand schneller....[/EDIT]
 
Zuletzt bearbeitet:
Dann hab ich jetzt ein Problem, denn Punkt, Vektor und Form sind mir vorgegeben und dürfen von mir nicht verändert werden.

Hat vielleicht jemand eine andere Idee, wie ich mit den gegebenen Klassen an die Eckpunkte kommen könnte?
 
Moment - du willst an die *Eckpunkte*? Form speichert ja nur den Ursprung, also den Mittelpunkt. Die Eckpunkte wird deine Klasse dynamisch berechnen müssen. Am besten im Konstruktor einmalig berechnen, dann kannst du sie als Instanzvariablen speicher und bei Bedarf darauf zugreifen. Aber dann musst du dran denken, die Punkte immer zu aktualisieren, falls irgendwelche Operationen gemacht werden. Also am besten eine private Methode hinzufügen, die die Eckpunkte berechnet und als Instanzvariablen speichert, und diese im Konstruktor sowie nach jeder Änderung aufrufen.
 
Dann hab ich jetzt ein Problem, denn Punkt, Vektor und Form sind mir vorgegeben und dürfen von mir nicht verändert werden.

Hat vielleicht jemand eine andere Idee, wie ich mit den gegebenen Klassen an die Eckpunkte kommen könnte?

Überschreibe die instanzvariable

Java:
public class Rechteck extends Form
{
    private Punkt origin;
    public Rechteck(origin, ..., double angle)
    {
        super(origin, angle);
        this.origin = origin;
        ...
    }
}
 
Zuletzt bearbeitet:
@rme: Genau das will ich in public Punkt punktA() ja tun, also die Eckpunkte in Abhängigkeit vom Mittelpunkt berechnen, aber ich komme nicht an x und y ran, weil sie in Form private sind.

@Tobse: Das funktioniert leider nicht. Bekomme schon in Deiner Zeile 7 die Fehlermeldung "origin has private access in Form
 
Hat die Klasse Form wirklich nur die 13 Zeilen, die du oben gezeigt hast? Da fehlt ja noch eine schließende Klammer, vielleicht sind da noch mehr Methoden? Falls es nämlich kein getOrigin oder Ähnliches gibt, ist es völlig sinnlos, dass die Klasse origin speichert - man kommt nämlich nie wieder ran.
 
die hat noch jede Menge Methoden. Ich dachte nur, dass davon keine für mein Problem relevant wäre und hab sie deshalb nicht mitkopiert. Hier ist die komplette Klasse Form:

Java:
public class Form {

    private Punkt origin;
    private double angle;
     
    public Form(Punkt origin, double angle) {
        this.origin = origin;
        this.angle = angle;
    }

    public Form(Punkt origin) {
        this(origin, 0);
    }

    public void rotate(double angle, Punkt centre) {
        origin = origin.rotate(angle, centre);  // points are immutable!
        this.angle = Vektor.addAngles(this.angle, angle); 
        // rest to be defined in sub-classes
    }

    public void rotate(double angle) {
        rotate(angle, origin);
        // rest to be defined in sub-classes
    }

    public void scale(double factor) {
        // to be defined in sub-classes
    }

    public void translate(Vektor vector) {
        origin = origin.translate(vector.freeVectorTip());  // points are immutable!
        // rest to be defined in sub-classes
    }

    public Punkt origin() {
        return origin;
    }

    public double angle() {
        return angle;
    }

    public String toString() {
        return "origin: " + origin + ", angle: " + String.format("%.3f", angle);
        // rest to be defined in sub-classes 
    }

    public void report() {
        System.out.println(this.getClass().getSimpleName() + ": " + this);
    }
        
}
 

Zurück
Oben