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