Это вопрос ООП для начинающих, на который, вероятно, есть много ответов, но я не смог их найти.Я постараюсь спросить здесь в надежде, что кто-то сможет объяснить или указать мне правильное направление.
В качестве примера рассмотрим мой MWE, где RightTriangle
расширяет Rectangle
, что расширяет Shapes
.Метод semiPerimeter()
реализуется путем вызова perimeter()
.
Все хорошо для Rectangle
, где работают perimeter()
и semiPerimeter()
.Проблема заключается в perimeter()
методе RightTriangle
, который переопределяет Rectangle
perimeter()
.При запуске теста я получаю StackOverflowError, потому что semiPerimeter()
вызывает perimeter()
, что в свою очередь вызывает semiPerimeter()
.
Почему при вызове super.semiPerimeter()
не используется perimeter()
из прямоугольного суперкласса?
MWE
Shapes.java
package ShapesPackage;
public abstract class Shapes {
public abstract double perimeter();
public double semiPerimeter() {
return perimeter() / 2;
}
}
Rectangle.java
package ShapesPackage;
public class Rectangle extends Shapes {
public double perimeter() {
return 2 * (3 + 4); //2*(length+height)
}
}
RightTriangle.java
package ShapesPackage;
public class RightTriangle extends Rectangle {
public double perimeter() {
return super.semiPerimeter() + 5; //half the rectangle perimeter plus some hypotenuse
}
}
Test.java
package ShapesPackage;
public class Test {
public static void main(String[] args) {
Rectangle r = new rectangle();
System.out.println(r.perimeter());
System.out.println(r.semiPerimeter());
RightTriangle t = new rightTriangle();
System.out.println(t.perimeter()); //Fails
}
}