2

だから私はjavaで学校の割り当てをしています...これはクラス階層の種類の割り当てであり、「Shape.java」を拡張する「ClosedShape.java」クラスを拡張する「Triangle.java」クラスを作成することになっています".... ClosedShapeとShapeの両方が提供されているので、おそらく問題はありません(とにかく投稿します)が、私のTriangleクラスは次のとおりです。

    public abstract class Triangle extends ClosedShape{

        public Triangle(int[] a, int[] b, int base, int height){
            super(true, 3, a, b);
            setWidth(base);
            setHeight(height);
            setXYCoords(a, b);
        }

         public Triangle(int x, int y, int base, int height){
            int[] a = new int[3];
            int[] b = new int[3];

            a[0] = x;
            a[1] = (x+base)/2;
            a[2] = (x+base);

            b[0] = y;
            b[1] = (y+height)/2;
            b[2] = (y+height);
         }

}

コンストラクターが2つある理由は、形状を描画するためのポイントを保持するためにこれら2つの配列を作成する必要があるためです。次に、それらをClosedShape(boolean、int、int []、int [])に渡す必要があります。スーパークラス...同じコンストラクターで配列を作成する場合は、super()を呼び出す前に配列を定義して渡す必要がありますが、super()を最初に呼び出す必要があるため、これは許可されません。 .so現在、Triangle.javaをコンパイルしようとすると、次のエラーが発生します。

Triangle.java.14: error: no suitable constructor found for ClosedShape()
  { //little arrow pointing under the '{'

constructor ClosedShape.ClosedShape(boolean, int, int[], int[]) is not applicable
    (actual and formal argument lists differ in length)      
    constructor ClosedShape.ClosedShape(boolean, int) is not applicable
    (actual and formal argument lists differ in length)
1 error

また、割り当てで、三角形の署名はTraingle(int x、int y、int base、int height)でなければならないことを指定しています...だから....私が間違っていない場合(どのjava私は...)すべての適切な値を使用してスーパー呼び出しを行いコンストラクター "ClosedShape(boolean、int、int []、int [])"があります...ここにClosedShapeクラスがあります。

    import java.awt.Graphics;

public abstract class ClosedShape extends Shape {
    boolean polygon;
    int numPoints;
    int[] xVertices;
    int[] yVertices;
    int x,y,width, height;

    public ClosedShape(boolean isPolygon, int numPoints) {
        super(0,0);
        this.polygon = isPolygon;
        this.numPoints = numPoints;
    }

    public ClosedShape(boolean isPolygon, int numPoints, int[] x, int[] y) {
        super(x[0],y[0]);
        this.polygon = isPolygon;
        if (isPolygon) {
            this.numPoints = numPoints;
            xVertices = new int[numPoints]; // error check?  if x.length == numPoints
            //for (int i = 0; i < x.length; i++) { // make copy of array: why?
            //  xVertices[i] = x[i];
            //}
            yVertices = new int[numPoints]; // error check?  if y.length == numPoints
            for (int i = 0; i < y.length; i++) { // make copy of array
                    yVertices[i] = y[i];
            }
        }
        else { // its an oval - define bounding box
            this.numPoints = 4;
            this.x = x[0];
            this.y = y[0];
            width = x[1];
            height = y[1];
        }
    }

    public void setXYCoords(int[] x, int[] y){
        this.xVertices = x;
        this.yVertices = y;
    }

    // Gives access to the width attribute
    public void setWidth(int width){
        this.width = width;
    }

    // Gives access to the height attribute
    public void setHeight(int height) {
        this.height = height;
    }

    public void draw(Graphics g) {
        if (polygon) {
            g.drawPolygon(xVertices, yVertices, numPoints);
        }
        else {
            g.drawOval(x, y, width, height);
        }

    }

    public abstract double Area();
    public abstract double Perimeter();








}
4

3 に答える 3

4

問題は、 にはデフォルトの引数なしのコンストラクターがないことですClosedShape

この ctor を見てください:

 public Triangle(int x, int y, int base, int height){

コンストラクターへの明示的な呼び出しはないsuper()ため、コンパイラーは、引数なしのコンストラクターを呼び出す必要があると想定します。しかし、1つもありません...

于 2013-03-01T03:13:08.540 に答える
1

私はついにそれを理解しました。使用する必要のないコンストラクターを呼び出しています! 最初のコンストラクターを呼び出してから、setXYCoords()メソッドを使用して配列で必要なことを行うだけで済みます....最終的なコードは次のとおりです。

(ClosedShape.java は同じままです)

import java.awt.Graphics;

public class Triangle extends ClosedShape{

    public Triangle(int x, int y, int base, int height){
        super(true, 3);

        setWidth(base);
        setHeight(height);

        int [] arrayX = new int[3];
        arrayX[0] = x;
        arrayX[1] = (x+(width/2));
        arrayX[2] = (x+width);

        int [] arrayY = new int[3];
        arrayY[0] = y;
        arrayY[1] = (y-height);
        arrayY[2] = y;

        setXYCoords(arrayX, arrayY);

    }

    public double Area(){
                return 0;
    }

    public double Perimeter(){
        return 0;
    }


}
于 2013-03-02T03:15:03.300 に答える
-1

@duffymo が述べているように、明示的に を呼び出さない場合super()、コンパイラは引数なしのコンストラクターへの呼び出しを挿入します。

あなたが探している解決策はファクトリーメソッドだと思います。createTriangle(int x, int y, int base, int height)たとえば、静的メソッドを作成できます。そのメソッドで配列を構築し、適切なコンストラクターを呼び出してから、構築されたオブジェクトを返します。

于 2013-03-01T03:18:38.293 に答える