2011-10-10 172 views
1

我有两个类,一个Circle()和另一个GeometricObject()。我必须将GeometricObject扩展为circle,然后在GeometricObject中实现可比较的。当我这样做时,我在我的Circle()类中得到一个错误,它说不能重写抽象方法,而Circle()不是抽象的。我还必须在测试/主类中比较两者,任何人有任何想法可以解决这个错误,并比较两者?提前致谢。比较两个对象,java

package chapter_14; 

public class Circle extends GeometricObject{ //here is where i get an error 
    private double radius; 

    public Circle() { 
    } 

    public Circle(double radius) { 
    this.radius = radius; 
    } 

    /** Return radius */ 
    public double getRadius() { 
    return radius; 
    } 

    /** Set a new radius */ 
    public void setRadius(double radius) { 
    this.radius = radius; 
    } 

    /** Return area */ 
    @Override 
    public double getArea() { 
    return radius * radius * Math.PI; 
    } 

    /** Return diameter */ 
    public double getDiameter() { 
    return 2 * radius; 
    } 

    /** Return perimeter */ 
    @Override 
    public double getPerimeter() { 
    return 2 * radius * Math.PI; 
    } 

    /* Print the circle info */ 
    public void printCircle() { 
    System.out.println("The circle is created " + getDateCreated() + 
     " and the radius is " + radius); 
    } 

} 

GeometricObject类:

package chapter_14; 


public abstract class GeometricObject implements Comparable{ 

    private String color = "white"; 
    private boolean filled; 
    private java.util.Date dateCreated; 

    /** Construct a default geometric object */ 
    protected GeometricObject() { 
    dateCreated = new java.util.Date(); 
    } 

    /** 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, 
    * so, the get method name is 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 */ 
    @Override 
    public String toString() { 
    return "created on " + dateCreated + "\ncolor: " + color + 
     " and filled: " + filled; 
    } 

    /** Abstract method getArea */ 
    public abstract double getArea(); 

    /** Abstract method getPerimeter */ 
    public abstract double getPerimeter(); 

} 

回答

5

的问题是,GeometricObject被宣布实行Comparable

public abstract class GeometricObject implements Comparable { 

这意味着任何具体的子类必须实现compareTo方法,例如:

@Override public int compareTo(Object o) { 
    Circle circle = (Circle) o; 
    return Double.compare(getArea(), circle.getArea()); 
} 

随着这种变化,它编译我在JDK 7中。

+0

我明白了,子类也必须继承compareTo方法。这解决了它,现在我只需要弄清楚测试部分。十分感谢你的帮助。 – Gmenfan83

+0

@Jason:它必须*实现* Comparable中声明的'compareTo'方法,因为'GeometricObject'不这样做。 –

3

你不重写两种方法,因为从超类中的方法都是抽象的。因此你必须实现它们,而不是覆盖它们(以“不能覆盖抽象方法”为核心)。

您还需要在Circle中提供此方法。

@Override 
public int compareTo(Object o) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

GeometricObject不需要实现此方法,因为该类是抽象的。但是Circle不是,因此必须实现所有方法(Comparable强制使用此方法;使用Circle()的核心不是抽象的)。

您无法将GeometricObject与Circle进行比较,因为GeometricObject是抽象的,这意味着您无法创建此类的实例。

3

这是因为你的ComparableObject类实现了Comparable其中接口有:

int compareTo(Object o) 

您必须在非抽象类中实现所有抽象方法。在这种情况下,从ComparableObject派生的每个类中都必须添加执行comparTo,因为这是抽象方法。