【问题标题】:"must implement inherited abstract method"“必须实现继承的抽象方法”
【发布时间】:2012-03-20 04:58:32
【问题描述】:

我有这个原始的父抽象类 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();
}

【问题讨论】:

  • 很可能,你忘了在你的超类GeometricObject中实现抽象方法之一。
  • 听起来GeometricObject 中可能有一些您没有覆盖的抽象方法。编译器应该准确地告诉你你缺少哪个方法,哪个应该回答你的问题。
  • 除非您发布该抽象类的代码,否则我们无法告诉您错误发生的原因。
  • 显示几何对象的代码。
  • 最好使用好的IDE(eclipse/intellij/netbeans)..这样可以避免一些小错误。

标签: java


【解决方案1】:

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

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

【讨论】:

  • 有趣 - eclipse 报告该错误,而 javac(1.6 和 1.7)只是抱怨在非法 class“修饰符”的行中缺少一些 {}...跨度>
【解决方案2】:

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

更新

找到了。我将这两个类粘贴到 Eclipse 中,然后繁荣:

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

微妙而棘手的错字。从这两个构造函数声明中删除“类”一词,您仍然会遇到一两个错误,但它们应该很明显。

【讨论】:

    【解决方案3】:

    当您编写“Octagon extends GeometricObject”时,您基本上是在保证您的类可以做 GeometricObject 可以做的所有事情,甚至更多。因此,如果您没有实现作为 GeometricObject 一部分的方法,那么您就违背了这个承诺,Java 编译器也反对这个。

    【讨论】:

    • 如果问题上的 cmets 正确地解释了你的困惑,那么我的回答有点不必要......
    • 哦,实际上Geometric对象中只有两个抽象方法getArea()和getPerimeter()。编译器说我必须实现 thosse,我想我做到了。
    【解决方案4】:

    GeometricObject 是一个抽象类,在您尚未提供实现的 cass GeometricObject(或其超类之一)中有一个 abstract 方法。

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

    【讨论】:

      【解决方案5】:

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

      不过,我有一个很好的主意,那就是Comparable。它是正确的Comparable&lt;T&gt;,但您的代码中有Comparable。尝试将您的代码更改为class Octagon extends GeometricObject implements Cloneable, Comparable&lt;Object&gt;

      【讨论】:

        猜你喜欢
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        相关资源
        最近更新 更多