Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何有效地利用接口上的继承和多态性_Java_Inheritance_Interface_Polymorphism - Fatal编程技术网

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

Java 如何有效地利用接口上的继承和多态性,java,inheritance,interface,polymorphism,Java,Inheritance,Interface,Polymorphism,我创建了一个接口“Polygon”,用于存储抽象方法:“area”和“permiture”。然而,当实现多边形的类在计算面积和周长时涉及不同的计算时,我不理解如何有效地使用接口。在我看来,我甚至不需要接口“多边形”,因为它在我的代码中没有用处 我已尝试在Triangle类中重写方法“area”,但收到以下错误: 三角形不是抽象的,并且不会覆盖多边形中的抽象方法area() 因为三角形区域有构造函数。我无法修改Polygon-area方法,使其具有三角形所需的相同数量的构造函数,因为它不适合我的矩

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

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

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

因为三角形区域有构造函数。我无法修改Polygon-area方法,使其具有三角形所需的相同数量的构造函数,因为它不适合我的矩形类

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

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

接口的目的是作为对象公共特性的抽象视图

对于多边形,您已经确定了它们的一些共同点,即所有多边形都有一个面积,它们都有一个周长

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

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;
    }
}
如您所见,由于计算面积的输入不同,取决于多边形的类型,面积方法不能采用公共参数集,因此它们必须嵌入到多边形对象中,因此我们可以得到公共面积方法。

我认为

  • Polygon
    接口中的方法应返回值(面积和周长)
  • 实现
    Polygon
    的每个形状类都应该有自己的字段和相应的构造函数来初始化它们。(例如长度和高度),将用于实施面积和周长
  • 所以

  • 类三角形应该有一个构造函数

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

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


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

    void area()
    是否应该返回该区域?为什么
    Triangle
    没有带参数
    base
    height
    的构造函数?您还应该对尝试重写方法的方法应用
    @Override
    ,以确保获得预期的匹配。(您解释错误原因的注释不正确。)我没有添加带参数的构造函数,因为行“testTriangle.area(2,2);”在main方法中,设置底部和高度。这是方法的糟糕用法。如果您从不调用
    面积(双精度)
    ,三角形的面积是多少。你认为这就像父亲拥有孩子将拥有的一切一样。如果您知道所有形状都有面积方法。您向父对象编码,默认情况下所有子对象都将拥有它,并且仅针对该子对象的特定方法将向继承者编码。如果这有意义的话。您好,Andreas,您能解释一下为什么我们应该实现一个接口吗?因为我们可以只编写每个类中的方法?我觉得界面没有用;然而,我的项目需要我们创建一个。@JavaMan接口允许代码以相同的方式处理多边形,而不考虑它们之间的差异。如果需要打印多边形的面积,则无论多边形形状如何,只需编写一次代码。如果没有接口,那么每个形状都需要该代码的副本。@JavaMan@JavaMan@JavaMan