2016-04-11 20 views
7

にスーパーと協力して、私はエラーを取り除くしようとしています:<code>Cube</code>クラスのJava

Cube.java:12: error: constructor Rectangle in class Rectangle cannot be applied to given types; 
    super(x, y); 
    ^
    required: int,int,double,double 
    found: int,int....... 

を私はキューブの各面は、その長さと幅と同じである必要は長方形である知っていますキューブの側面ですが、Rectangleコンストラクタに渡す必要があるものがわからないので、その長さと幅をキューブの側面と同じにする必要があります。

も矩形倍の面積である体積をキューブの辺の長さを計算しようと

これはキューブクラス

// --------------------------------- 
// File Description: 
// Defines a Cube 
// --------------------------------- 

public class Cube extends Rectangle 
{ 


    public Cube(int x, int y, int side) 
    { 
    super(x, y); 
    side = super.area(); // not sure if this is right 
    } 


    public int getSide() {return side;} 

    public double area()  {return 6 * super.area();} 
    public double volume() {return super.area() * side;} 
    public String toString() {return super.toString();} 
} 

であり、これは矩形クラス

// --------------------------------- 
// File Description: 
// Defines a Rectangle 
// --------------------------------- 

public class Rectangle extends Point 
{ 
    private int x, y; // Coordinates of the Point 
    private double length, width; 

    public Rectangle(int x, int y, double l, double w) 
    { 
    super(x, y); 
    length = l; 
    width = w; 
    } 

    public int  getX()   {return x;} 
    public int  getY()   {return y;} 
    public double getLength() {return length;} 
    public double getWidth()  {return width;} 

    public double area()  {return length * width;} 
    public String toString() {return "[" + x + ", " + y + "]" + " Length = " + length + " Width = " + width;} 
} 
あります
+3

Rectangle'は、2つの引数を取るコンストラクタを持っていない 'ので、あなたは'スーパー(x、y)を呼び出したときに呼び出されるどのようなコードを期待していますに、 '? – azurefrog

+1

あなたの 'Cube'は' Rectangle'から継承する必要がありますか? 'Rectangle'の配列を保有するのではなく、それぞれ' Point'と 'length'を持っていますか?また 'Rectangle'は' Point'を拡張しているので、 'Rectangle'に' x'、 'y'、' getX'や 'getY'を定義する必要はありません。これらのプロパティを継承します。 –

答えて

10

このオブジェクトの構造は、拡張の考え方を忘れているようです。

CubeRectangleではありません。 Cubeは、方向の空間データを持つ複数の複合体であると考えられますが、長方形はCubeのメンバ(読み取り属性/フィールド)である必要があります。

この点を説明するために、次の文の違いを考慮してください。

すべての立方体は長方形です。

すべてのネコは動物です。

スーパークラスAnimalを拡張するCatオブジェクトを作成すると考えられます。 CubeRectangleはこの関係を共有しません。

のようなものであるためにあなたのコードをリファクタリング考えてみます。さらに一歩これを取るために

public class Cube { 
    private List<Rectangle> faces: 

    .... 

} 

、すべてではないRectangle sがPoint秒です。

ポイントは、x、y座標の1つのペアです。 Rectangleを正確に描くために必要な情報の最小量は2つです。Pointです。

あなたは反対側の隅に(+によりここに記さ)Point秒を持っている場合は、あなたのRectangleを描くことができます

+-- 
| | 
--+ 

を参照してください。

これに照らして、Rectangleには、Pointをメンバーとしてリファクタリングする必要があります。

のようなもの:

public class Rectangle { 
    private Point firstCorner; 
    private Point secondCorner; 

    ... 
} 
3

問題はRectangleコンストラクタが4つの引数を必要とし、のインスタンスを作成するときに2を渡すだけです10。任意の矩形が原点のxとy、および幅と高さを必要とする - あなたは少し、それは完璧な理にかなっていると思われる場合

public Cube(int x, int y, int side) 
    { 
    super(x, y, side, side); 
    } 

:また、あなたの長さを渡す必要があります。キューブの幅と高さが同じ場合でも、値は何であるかは依然として矩形に伝えておく必要があります)

2

super(x, y)の引数の数が、Rectangleのコンストラクタの引数と一致しません。明示的にスーパークラスコンストラクターを呼び出すときは、スーパークラスにコンストラクターが一致することを確認する必要があります。

2

Rectangleのスーパークラスは、Cubeではなく、Pointです。 を使用すると、コンストラクタCubeのコンストラクタを呼び出すことができませんPoint