“必须实现继承的抽象方法”

时间:2012-03-20 04:58:32

标签: java

我有这个原始的父抽象类Geometric,我在Octagon中扩展它,并且还实现了Comparable和Cloneable。 IDK为什么我一直收到上述错误。请帮助我们。

class Octagon extends GeometricObject implements Cloneable, Comparable{
  private double side;
  public class Octagon(){
  }
  public class Octagon(double s){
    side=s;
  }
  public double getArea(){
    return (2+4/Math.sqrt(2))*side*side;
  }
  public double getPerimeter(){
    return 8*side;
  }
  public int compareTo(Object o){
    if (getArea()>((Octagon)o).getArea()){
      return 1;
    }
    else if (getArea()<((Octagon)o).getArea()){
      return -1;
    }
    else 
      return 0;
  }
  public Object clone() throws CloneNotSupportedException{
    super.clone();
  }
}

这是我的几何课

public abstract class GeometricObject{
  private String color="white";
  private boolean filled;
  private java.util.Date dateCreated;

  protected GeometricObject(){
    dateCreated=new java.util.Date();
  }

  protected GeometricObject(String color, boolean filled){
    dateCreated=new java.util.Date();
    this.color=color;
    this.filled=filled;
  }

  public String getColor(){
    return color;
  }
  public void setColor(String color){
    this.color=color;
  }
  public boolean isFilled(){
    return filled;
  }
  public void setFilled(boolean filled){
    this.filled=filled;
  }
  public java.util.Date getDateCreated(){
    return dateCreated;
  }
  public String toString() {
    return "created on "+dateCreated+"\ncolor: "+color;
  }
  public abstract double getArea();
  public abstract double getPerimeter();
}

5 个答案:

答案 0 :(得分:6)

知道了 - 错误在你的“构造函数”中:

public class Octagon(){
//     ^^^^^ <- remove
}

public class Octagon(double s){
//     ^^^^^ <- remove
  side=s;
}

class“修饰符”是非法的。只需删除它们。


奖金建议 - 考虑更改compareTo的实施。你正在看八角形区域,这对于比较是完全可以的。但它需要在每次需要比较两个八边形时计算面积。

由于该区域仅取决于side值,因此将八边形按side长度进行比较就足够且效率更高:

public int compareTo(Object other) {

 if (!(other instanceof Octagon)) {
   throw new IllegalArgumentException("Comparision with other types is not supported");
 }

 Integer thisSide = side;    // autoboxing, legal conversion since Java 1.5
 Integer otherSide = ((Octagon) other).side;     

 // Easy trick: Integer is already comparable ;)
 return thisSide.compareTo(otherSide);
}

答案 1 :(得分:2)

我的猜测是GeometricObject是一个抽象类。它可能有一些需要在Octogon中实现的抽象方法。

<强>更新

找到它。我将这两个类粘贴到Eclipse中,并且热潮:

public class Octagon(){
}
public class Octagon(double s){
    side=s;
}

微妙而棘手的错字。从这两个构造函数声明中删除单词“class”,你仍然会有一两个错误,但它们应该是显而易见的。

答案 2 :(得分:0)

当您编写“Octagon extends GeometricObject”时,您基本上承诺您的类可以执行GeometricObject可以执行的所有操作,甚至更多。因此,如果你没有实现一个属于GeometricObject的方法,那么你就违背了这个承诺,而Java编译器则反对它。

答案 3 :(得分:0)

GeometricObject是一个抽象类,在cass abstract(或其中一个超类)中有一个GeometricObject方法,你没有提供实现。

如果其中一个抽象方法缺少实现,则无法构造具体的类,则会出现编译错误。

答案 4 :(得分:0)

正如其他人所说,你应该发布GeometricObject.java的内容以获得明确的答案。

然而,我非常清楚它是Comparable。它是正确Comparable<T>但您的代码中有Comparable。尝试将代码更改为class Octagon extends GeometricObject implements Cloneable, Comparable<Object>