解决在子类

时间:2016-04-04 23:01:23

标签: java inheritance abstract-class

我意识到这个问题已经重复多次了,但是这里有:

我的任务是创建(使用Java)一个名为Triangle的抽象类,它有抽象方法getArea()和getPerimeter()以及一个构造函数,它接受一个表示边长的双精度(你用&#39) ;看看为什么它只是一秒内的一个值。我应该创建具体的子类EquilateralTriangle和RightTriangle,它们扩展Triangle并分别实现getArea()和getPerimeter(),它们也意味着有一个构造函数,它可以为边长加入一个double。

我遇到的问题是不知道如何存储边长,因为它意味着存储在属于Triangle的字段中,Triangle是需要访问的每个子类的超类。在自己的领域和周边方法领域。我开始认为我可以将它保存为Triangle中的私有字段,并且它将简单地在每个子类中继承并在每个子类中正确设置'构造函数通过调用super()。编译器抱怨该字段在Triangle中具有私有访问权限,因此我将该字段切换为受保护,现在它编译但是给了我运行时错误" java.lang.IllegalAccessError:尝试访问字段Triangle.side from class EquilateralTriangle。"我不确定如何以不明确创建字段来保存每个子类中的边长的方式来设计它,或类似的东西。这是我目前的代码:

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);
    }
}

1 个答案:

答案 0 :(得分:2)

因此使用受保护字段的方法很好。最好将其设为私有,然后在protected double getSide()类中添加Triange

    public static abstract class Triangle {
      private double side;
      public abstract double getArea();
      public abstract double getPerimeter();
      public double getRatio() {
        return getArea() / getPerimeter();
      }
      public Triangle(double side) {
        this.side = side;
      }

      protected double getSide()
      {
          return this.side;
      }

    @Override
    public String toString() {
        return "Triangle: SideLen = " + this.side 
          + " || Area = " + getArea()
          + " || Perimeter = " + getPerimeter()
          + " || Ratio = " + getRatio();
    }
 }

在子类中,将this.side替换为getSide()