Ich weiß, diese Frage ist ein Duplikat über viele Male, aber hier geht:Arbeit um für Zugriff auf Feld der abstrakten Klasse in Subklassen-
Ich habe für Hausaufgaben (mit Java) eine abstrakte Klasse namens Dreieck zu schaffen beauftragt worden das hat abstrakte Methoden getArea() und getPerimeter() und einen Konstruktor, der ein Double übernimmt, das die Seitenlänge darstellt (Sie werden sehen, warum es nur einen Wert in einer Sekunde gibt). Ich soll konkrete Unterklassen EquilateralTriangle und RightTriangle erstellen, die Triangle erweitern und jeweils getArea() und getPerimeter() implementieren, und sie sollen auch Konstruktoren enthalten, die für die Seitenlänge ein Double aufnehmen.
Das Problem, das ich habe, ist nicht wissen, wie die Seitenlänge zu speichern, da es in dem Feld von Triangle, die Oberklasse von jeder Unterklasse, die auf dieses Feld in einem eigenen Bereich zugreifen müssen, gespeichert werden soll und Perimeter-Methoden. Ich fing an zu denken, ich könnte es als privates Feld in Triangle behalten, und es würde einfach in jeder Unterklasse vererbt werden und korrekt im Konstruktor jeder Unterklasse durch Aufrufe von super() gesetzt werden. Der Compiler beschwert sich über das Feld mit privatem Zugriff in Triangle, also habe ich das Feld auf protected gesetzt, und es kompiliert jetzt, aber gibt mir den Laufzeitfehler "java.lang.IllegalAccessError: versucht, auf Feld Triangle.side von der Klasse EquilateralTriangle zuzugreifen. " Ich bin mir nicht sicher, wie ich dies so gestalten soll, dass ich nicht explizit ein Feld erstelle, das die Seitenlänge in jeder der Unterklassen hält, oder so ähnlich. Hier ist mein aktueller Code:
public abstract class Triangle {
protected double side;
public abstract double getArea();
public abstract double getPerimeter();
public double getRatio() {
return getArea()/getPerimeter();
}
public Triangle(double side) {
this.side = side;
}
@Override
public String toString() {
return "Triangle: SideLen = " + this.side
+ " || Area = " + getArea()
+ " || Perimeter = " + getPerimeter()
+ " || Ratio = " + getRatio();
}
}
public class EquilateralTriangle extends Triangle {
private static final double AREA_COEFFICIENT = Math.sqrt(3)/4;
public EquilateralTriangle(double side) {
super(side);
}
public double getArea() {
return AREA_COEFFICIENT * this.side * this.side;
}
public double getPerimeter() {
return this.side * 3;
}
}
public class RightTriangle extends Triangle {
private static final double PERIMETER_COEFFICIENT = Math.sqrt(2) + 2;
public double getArea() {
return this.side * this.side/2;
}
public double getPerimeter() {
return this.side * PERIMETER_COEFFICIENT;
}
public RightTriangle(double side) {
super(side);
}
}
Haben Sie überlegt, eine "Getter" -Methode zu erstellen? –
Ah ... Es ist mir in den Sinn gekommen, aber ich habe es nie wirklich versucht - das behebt es. Vielen Dank! – Nick