猿问

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

我创建了一个接口“Polygon”,用于存储抽象方法:“面积”和“周长”。但是,当实现 Polygon 的类涉及计算面积和周长的不同计算时,我不明白如何有效地使用该接口。在我看来,我什至不需要接口“Polygon”,因为它在我的代码中没有用处。

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

三角形不是抽象的,不会重写多边形中的抽象方法area()

因为三角形区域有构造函数。我无法修改 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();

我已经设法在我的代码中获得了我需要的答案,即区域和周长,但我需要知道如何修改我的代码以利用继承和多态性。


繁华开满天机
浏览 159回答 3
3回答

千万里不及你

接口的目的是成为对象共同特征的抽象视图。对于多边形,您已经确定了它们的一些共同点,即所有多边形都有一个面积,并且它们都有一个周长。抽象视图是获取那些共同的值: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;    }}正如你所看到的,由于计算面积的输入不同,根据多边形的类型,面积方法不能采用一组通用的参数,因此它们必须嵌入到多边形对象中,因此我们可以得到一个通用的面积方法。

拉丁的传说

我看到的第一个问题是您没有在实现该接口的类中声明外围方法,因此这会导致编译器错误。至于其他人所说的,您将在这两个方法上返回一个值,因此它们不应该是 void 方法。另外,为什么在 Triangle 类中使用重载方法?

翻过高山走不出你

我认为,接口中的方法Polygon应返回值(面积和周长)。实现的每个形状类都Polygon应该有自己的字段和适当的构造函数来初始化它们。(例如长度和高度),将用于面积和周长的实现。所以,Triangle 类应该有一个构造函数,public Triangle (final Double base, final Double height) {    this.base = base;      this.height = height; };你的区域方法应该是这样的, @Override  public Double area() {    return base * height * (0.5d);  }你应该像下面这样使用它,final Polygon polygon = new Triangle(13, 212); final Double area = polygon.area(); final Double perimeter = polygon.perimeter();
随时随地看视频慕课网APP

相关分类

Java
我要回答