我必须将类几何对象扩展为类三角形。
我似乎无法找到导致编译器说出错误的错误
"必须实现继承方法GeometricObject.getArea" "必须实现继承方法GeometricObject.getPerimeter"
这是我的三角形代码
public class Triangle extends GeometricObject {
double side1 = 1.0;
double side2 = 1.0;
double side3 = 1.0;
public Triangle()
{
}
public Triangle(double s1, double s2, double s3)
{
double side1 = s1;
double side2 = s2;
double side3 = s3;
}
public void getSide1()
{
System.out.print(side1);
}
public void getSide2()
{
System.out.print(side2);
}
public void getSide3()
{
System.out.print(side3);
}
public double getArea(double s1, double s2, double s3)
{
double s = (s1+s2+s3);
double area = Math.sqrt((s-s1)-(s-s2)-(s-s3));
return area;
}
public double getPerimeter(double s1, double s2, double s3)
{
double peri = (s1+s2+s3);
return peri;
}
public String toString()
{
return ("Triangle Side 1: " + side1 + " Triangle Side 2: " + side2 + " Triangle Side 3: " + side3);
}
}
这是geometricobject的代码
public abstract class GeometricObject {
private String color = "white";
private boolean filled;
private java.util.Date dateCreated;
/** Construct a default geometric object */
protected GeometricObject() {
dateCreated = new java.util.Date();
}
/** Construct a geometric object with color and filled value */
protected GeometricObject(String color, boolean filled) {
dateCreated = new java.util.Date();
this.color = color; this.filled = filled;
}
/** Return color */
public String getColor() {
return color;
}
/** Set a new color */
public void setColor(String color) {
this.color = color; }
/** Return filled. Since filled is boolean, the get method is named isFilled */ public boolean isFilled() {
return filled;
}
/** Set a new filled */
public void setFilled(boolean filled) {
this.filled = filled;
}
/** Get dateCreated */
public java.util.Date getDateCreated() {
return dateCreated;
}
/** Return a string representation of this object */
public String toString() {
return "created on " + dateCreated + "\ncolor: " + color + " and filled: " + filled; }
/** Abstract method getArea and getPerimete */
public abstract double getArea(); //abstract method
public abstract double getPerimeter();
}
有人可以指出我错过了什么吗?
答案 0 :(得分:2)
父类中的这两个方法:
public abstract double getArea();
public abstract double getPerimeter();
...标记为abstract
。这意味着子类必须1)实现它们,或2)声明自己abstract
(abstract class Triangle extends GeometricObject
)。
请注意,它们都没有声明任何参数。 getArea
中的getPerimeter
和Triangle
带有参数(三个双打),因此他们没有提供上述两种方法的实现,这些方法并不适用
要非抽象,Triangle
必须:
@Override
public double getArea() {
// ...implementation...
}
@Override
public double getPerimeter() {
// ...implementation...
}
请注意,与您目前拥有的那些不同,不接受任何参数。
您的方法不需要参数;相反,请使用您的实例字段side1
,side2
和side3
:
@Override
public double getArea()
{
double s = this.side1 + this.side2 + this.side3;
double area = Math.sqrt((s - this.side1) - (s - this.side2) - (s - this.side3));
return area;
}
@Override
public double getPerimeter()
{
double peri = this.side1 + this.side2 + this.side3;
return peri;
}
答案 1 :(得分:1)
在您的子类中,您没有覆盖GeometricObject类中名为getArea()和getParimeter()的抽象方法。您只是在子类中重载它们(getArea()和getPermission()方法),例如检查两个类中相应方法的原型,因为它们不相同。 定义getArea()[和getparimeter()]方法如下(在子类中):
public double getArea(){
// your code goes here...
}
OR再次声明它们如下:
public abstract double getArea();
然后你将不得不让你的孩子课抽象,这将使你无法创造它(儿童类')对象。
答案 2 :(得分:0)
您的getArea()
方法是抽象的。因此,它应该在某处有一个定义。这是因为当您将方法声明为抽象时,在声明它的类中,您不能拥有它的主体。因此,在子类中,您需要提供它。
抽象方法更多的是确保所有子类遵循该方法的相同签名,即使每个子类'对此的定义可能不同。
所以改变你的参数,使签名匹配。
因此,您已将getArea()声明为abstract,请在签名中添加所需的3个双参数。
即。您的声明应该是:
public abstract double getArea(double s1,double s2,double s3);
答案 3 :(得分:0)
您不会覆盖,而是重载 getArea
和getPerimeter
- 覆盖意味着根据规范实施该方法超类,重载意味着使用参数扩展方法,但保持名称和返回类型与重载方法相同。
答案 4 :(得分:0)
或者您需要在抽象类中为抽象方法添加参数:
public abstract double getArea(double side1, double side2, double side3);
//abstract method
public abstract double getPerimeter(double side1, double side2, double side3);