2012-03-20 106 views
0

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

最可能的是,你忘了实现你的父类的抽象方法之一'GeometricObject'。 – vidit 2012-03-20 05:00:53

+1

听起来好像在'GeometricObject'中有一些抽象方法,你不会覆盖。编译器应该告诉你,你错过了哪个方法,哪个应该回答你的问题。 – 2012-03-20 05:00:57

+0

除非您发布该抽象类的代码,否则我们不能告诉您为什么发生错误。 – asgs 2012-03-20 05:01:25

回答

5

得到它 - 错误是你“构造”中:

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

有趣的 - eclipse报告javac(1.6和1.7)错误只是在用非法的'class'“修饰符”在行上丢失了一些'{'和'}'... – 2012-03-20 05:59:22

0

当你写的“八方延伸GeometricObject”,你基本上是有前途的,你的类可以做的一切,一个GeometricObject可以做的,也许更多。所以如果你没有实现GeometricObject的一部分的方法,那么你就违背了这个承诺,Java编译器反对这个。

+0

如果关于这个问题的评论正确地解释了你的困惑,那么我的回答有些不必要...... – mfrankli 2012-03-20 05:02:48

+0

哦,实际上在Geometric对象中只有两个抽象方法是getArea()和getPerimeter()。编译器说我必须执行thosse,我认为我是这么做的。 – teamaster 2012-03-20 05:04:35

2

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

UPDATE

发现了它。我把这两个类粘贴到Eclipse中,并且繁荣:

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

微妙和棘手的错字。从这两个构造函数声明中删除“class”一词,并且仍然有一两个错误,但它们应该很明显。

0

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

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

0

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

不过,我有个不错的主意,那就是Comparable。这是适当的Comparable<T>,但你的代码中有Comparable。试着改变你的代码class Octagon extends GeometricObject implements Cloneable, Comparable<Object>

相关问题