2012-03-20 167 views
0

私はこの元の親抽象クラスGeometricを持っていました。私はそれをOctagonで拡張していましたし、ComparableとCloneableも実装していました。 IDKなぜ私は上記のerror.Helpを取得し続けていただければ幸いです。"継承された抽象メソッドを実装する必要があります"

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

そして、あなたは、あなたが、本質的に、あなたのクラスがGeometricObjectを行うことができますすべてのもの、そしておそらくより多くを行うことができますことを期待されている「オクタゴンはGeometricObjectを拡張し、」書くときに、これは私の幾何学的クラス

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

+1

'GeometricObject'にオーバーライドしていない抽象メソッドがいくつかあるようです。コンパイラは、あなたの質問に答えなければならない欠落している方法を正確に教えてください。 –

+0

あなたがその抽象クラスのコードを投稿しない限り、エラーがなぜ発生するのかはわかりません。 – asgs

答えて

5

にコードを変更してみてください、それを手に入れた - エラーは、「コンストラクタ」あなたの中にある:

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

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

class「修飾」は違法です。単にそれらを削除してください。


ボーナスアドバイス - compareToの実装を変更することを検討してください。あなたは八角形の領域を見ていますが、それは比較のためには全く問題ありません。しかし、2つの八角形を比較する必要があるたびに、それぞれ面積を計算する必要があります。

エリアのみ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

Interesting - eclipseは、javac(1.6と1.7)が不正な 'class'"修飾子 "を含む行の' {'と'} 'にいくつか不満を訴えている間にエラーを報告します... –

0

です。したがって、GeometricObjectの一部であるメソッドを実装していない場合は、この約束を破ることになり、Javaコンパイラーはこれにオブジェクトを割り当てます。

+0

質問のコメントがあなたの混乱を正しく解釈したら、私の答えはいくぶん不要です... – mfrankli

+0

ああ、実際には、getArea()とgetPerimeter()というGeometricオブジェクトの2つの抽象メソッドしかありませんでした。コンパイラは、私がやったと思うthosseを実装しなければならないと言っています。 – teamaster

2

私の推測では、GeometricObjectは抽象クラスです。おそらく、Octogonに実装する必要のある抽象メソッドがいくつかあります。

UPDATE

それを発見しました。私はこれらの2つのクラスをEclipseに貼り付け、ブーム:

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

微妙でトリッキーなタイプミス。これらの2つのコンストラクタ宣言から "class"という単語を削除しても、1つまたは2つのエラーが残っていますが、明らかにする必要があります。

0

GeometricObjectは、抽象クラスであり、GeometricObject(またはそのスーパークラスの1つ)というキャッシングに、実装を提供していないabstractメソッドがあります。

具象クラスは、抽象メソッドの1つに実装がない場合には構築できません。コンパイルエラーが発生します。

0

他の人からも言われているように、確定的な回答のためにGeometricObject.javaの内容を投稿する必要があります。

それにもかかわらず、私はそれがComparableであることをかなり知っています。これは正しくComparable<T>ですが、コードにはComparableがあります。 class Octagon extends GeometricObject implements Cloneable, Comparable<Object>

関連する問題