如何有效利用接口上的继承和多态性

时间:2019-09-01 05:22:27

标签: java inheritance interface polymorphism

我创建了一个接口“多边形”,用于存储抽象方法:“区域”和“周边”。但是,当实现Polygon的类在计算面积和周长时涉及不同的计算时,我不理解如何有效地使用该接口。我认为,我甚至不需要接口“多边形”,因为它在我的代码中没有用。

我尝试覆盖Triangle类中的方法“ area”,但收到以下错误:

  

三角形不是抽象的,也不覆盖多边形中的抽象方法area()

因为Triangle区域具有构造函数。我不能修改Polygon区域方法以使其具有与Triangle相同数量的构造函数,因为那样将不适合我的Rectangle类。

public interface Polygon {

    void area();

    void perimeter();
}


class Triangle implements Polygon{

    private double triangleArea;
    private double trianglePerimeter;


    public Triangle (){};

    public void area(){}; //I've tried overriding method here but get a 
        compiler error since it is not identical to the Polygon method.

    public  double area(double base, double height){

       triangleArea = base * height * (.5);
       return triangleArea;
    }


public class Project25 {


public static void main(String[] args) {


    Triangle testTriangle = new Triangle();
    testTriangle.area(2, 2);
    testTriangle.printArea();

我已经设法在代码中找到所需的答案,即面积和周长,但是我需要知道如何修改代码以利用继承和多态性。

3 个答案:

答案 0 :(得分:0)

接口的目的是成为对象共同特征的抽象视图。

如果是多边形,您已经确定了它们共同的一些特征,即所有多边形都有面积,并且它们都有周长。

抽象视图将是 获取 这些常用值:

public interface Polygon {
    double getArea();
    double getPerimeter();
}

当然,只有在完全定义了多边形之后,您才能获取这些值,例如对于三角形,底数和高度可能足以计算面积,但不能计算周长。取而代之的是,您通常使用3边的长度。

public class Triangle implements Polygon {
    private final double a;
    private final double b;
    private final double c;

    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    @Override
    public double getArea() {
        // Using Heron's Formula
        double p = (a + b + c) / 2;
        return Math.sqrt(p * (p - a) * (p - b) * (p - c));
    }

    @Override
    public double getPerimeter() {
        return a + b + c;
    }
}

矩形更容易。

public class Rectangle implements Polygon {
    private final double width;
    private final double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }

    @Override
    public double getPerimeter() {
        return (width + height) * 2;
    }
}

如您所见,由于用于计算面积的输入不同,根据多边形的类型,Area方法不能采用一组通用的参数,因此必须将其嵌入到多边形中对象,这样我们就可以得到 common 区域方法。

答案 1 :(得分:0)

我认为,

  1. Polygon界面中的方法应返回值(面积和周长)。
  2. 实现Polygon的每个shape类都应具有自己的字段和适当的构造函数以对其进行初始化。 (例如长度和高度),将用于实现面积和周长。

所以

  1. Class Triangle应该有一个构造函数,

    public Triangle (final Double base, final Double height) {
       this.base = base;
       this.height = height;
    };
    
  2. 您的区域方法应类似于

     @Override
     public Double area() {
      return base * height * (0.5d);
     }
    
  3. 您应该像下面这样使用它,

    final Polygon polygon = new Triangle(13, 212);
    final Double area = polygon.area();
    final Double perimeter = polygon.perimeter();
    

答案 2 :(得分:0)

我看到的第一个问题是,您没有在实现该接口的类中声明perimeter方法,因此这会导致那里的编译器错误。至于其他人所说的,您在这两个方法上都返回了一个值,因此它们不应为空方法。

此外,为什么在Triangle类中使用重载方法?