0

I've got a class SimpleBoard that is extended by Land, which is then extended by Units. Whenever I try to compile Units, I get this error:

cannot find symbol
symbol  : constructor Land()
location: class Land
    public Units(int x, int y){

Thoughts on what's wrong?

EDIT: sorry, I was in a hurry! Here's the full code:

public class Units extends Land{

    private int attack;

    public Units(int x, int y) {

        if(x==1){
            attack = 1;
        }
        else if(x==2)
            attack = 2;
        else if(x==3)
            attack = 4;
        ar[y].AddUnit(this);
    }

    public int getAttack(){
        return attack;
    }
    }

and Land

public class Land extends SimpleBoard {
    private boolean barrel = false;
    private boolean crown = false;
    private boolean castle = false;
    private boolean stronghold = false;
    private int num;
    private int array = 0;
    public int[] adjacent;
    private Units [] Occupy = new Units [4];

    public Land(int z, int x, int c, int v, int b, int[] array){
        if(z == 1)
            barrel = true;
        if(x == 1)
            crown = true;
        if(c == 1)
            castle = true;
        if (v==1)
            stronghold = true;
        num = b;
        adjacent = array;
    }

    public void addUnit(Units x){
        Occupy[array] = x;
        array++;
    }

    public boolean checkB(){
        return barrel;
    }


    public int getAdj(int i){
        return adjacent[i];
    }
    }

And board

public class SimpleBoard {
    public static Land[] ar = new Land[3];
    public static void main(String[] args){
    Land One = new Land(1,0,0,0,1, new int[]{2, 3});
    Land Two = new Land(0,1,0,0,2, new int[]{1, 3});
    Land Three = new Land(0,0,1,0,3, new int[]{1, 2});
    ar[0] = One;
    ar[1] = Two;
    ar[2] = Three;

    Units Footman = new Units(1, 1);
    Units Knight = new Units(2, 3);
    Units Siege = new Units(3, 2);

    }
    }
4

2 に答える 2

1

あなたUnitsLandクラスをこれに変更することができます:

public class Units extends Land {

    private int attack;

    public Units(int z, int x, int c, int v, int b, int[] array) {
        super(z, x, c, v, b, array);
    }

    public Units(int x, int y) {

        if (x == 1) {
            attack = 1;
        } else if (x == 2) {
            attack = 2;
        } else if (x == 3) {
            attack = 4;
        }
        ar[y].addUnit(this);
    }

    public int getAttack() {
        return attack;
    }
}

public class Land extends SimpleBoard {

    // Declared variable

    public Land(int x, int y) {

    }

    // Rest of the code...
}

継承のため、クラスで指定するコンストラクターもUnitsクラスに存在する必要がありLandます。

クラス内のエラーを削除するために、内部にコードなしでLand呼び出されるコンストラクター(空白のコンストラクターのみ)をクラスに追加します。何をしようとしているのかわからないので、これはベストプラクティスではありません。お急ぎの場合はこちらをお試しいただけますが、時間があればお申し込みの目的を簡単に説明してください。Land(int x, int y)Units

アップデート:

SimpleBoardGame.java

public class SimpleBoardGame {

    private static Land[] ar = new Land[3];

    public static Land[] getAr() {
        return ar;
    }

    public static void main(String[] args) {
        Land One = new Land(1, 0, 0, 0, 1, new int[]{2, 3});
        Land Two = new Land(0, 1, 0, 0, 2, new int[]{1, 3});
        Land Three = new Land(0, 0, 1, 0, 3, new int[]{1, 2});
        ar[0] = One;
        ar[1] = Two;
        ar[2] = Three;

        // When you pass the parameter for 'y' please make sure it already minus by one.
        // If not, will occur the 'java.lang.ArrayIndexOutOfBoundsException'
        Unit Footman = new Unit(1, 0);
        Unit Knight = new Unit(2, 2);
        Unit Siege = new Unit(3, 1);

    }
}

Land.java

public class Land {

    // For boolean variable, no need to set the value as "false" since it default is "false".
    private boolean barrel;
    private boolean crown;
    private boolean castle;
    private boolean stronghold;
    private int num;
    private int array = 0;
    public int[] adjacent;
    private Unit[] Occupy = new Unit[4];

    public Land(int x, int y) {
        // Empty constructor...
    }

    public Land(int z, int x, int c, int v, int b, int[] array) {
        if (z == 1) {
            barrel = true;
        }
        if (x == 1) {
            crown = true;
        }
        if (c == 1) {
            castle = true;
        }
        if (v == 1) {
            stronghold = true;
        }
        num = b;
        adjacent = array;
    }

    public void addUnit(Unit x) {
        Occupy[array] = x;
        array++;
    }

    public boolean checkB() {
        return barrel;
    }

    public int getAdj(int i) {
        return adjacent[i];
    }
}

Unit.java (からUnits.javaに変更Unit.java

public class Unit extends Land {

    private int attack;

    public Unit(int z, int x, int c, int v, int b, int[] array) {
        super(z, x, c, v, b, array);
    }


    public Unit(int x, int y) {
        super(x, y);

        if (x == 1) {
            attack = 1;
        } else if (x == 2) {
            attack = 2;
        } else if (x == 3) {
            attack = 4;
        }

        addUnit(y);
    }

    /**
     * Overload method of the addUnit() of Land class.
     * Better not use "this" inside the constructor.
     * 
     * @param y
     */
    public final void addUnit(int y) {
        SimpleBoardGame.getAr()[y].addUnit(this);
    }

    public int getAttack() {
        return attack;
    }
}

注:メインクラス内の変数にアクセスする場合は、クラスのメインクラスとしてを継承しないようにしてください。そのためにsetterとgetterを作成するだけです。そして、このようにアクセスできます(クラスのメソッド内を参照してください)。SimpleBoardGameLandSimpleBoardGame.getAr()[y].addUnit(this);addUnit(int y)Unit

于 2012-07-31T02:27:22.917 に答える
0

アイデアは簡単です:

子は親から継承します。子コンストラクターでは、最初に親のコンストラクターを呼び出してオブジェクトの「親」部分を構築し、次に子部分を構築する必要があります。

これは、super(...) ステートメントによって行われます。

class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }
}

class Human extends Animal {
    String familyName;

    public Human(String name, String familyName) {
        super(name);    // HERE!!!! means calling Animal's Animal(String) ctor
        this.familyName = familyName;
    }
}

super(...) ステートメントを明示的に追加していない場合、コンパイラは、親クラスの引数なしのコンストラクターを呼び出していると想定します。

コンストラクターが定義されていないクラスの場合、コンパイラーはデフォルトの引数なしコンストラクターを追加します。ただし、Land には public Land(int z, int x, int c, int v, int b, int[] array) コンストラクターが定義されているため、Land には引数のないコンストラクターがありません。

Unit のコンストラクターには super(...) ステートメントがありません。つまり、Land の引数なしのコンストラクター (存在しない) を呼び出そうとするため、問題が発生しました。


編集:少し話題から外れていますが、継承の使用には意味がないように思えます。「Land」が「SimpleBoard」である理由 なぜ「ユニット」は「土地」なのですか?私には、彼らは「is-a」ではなく「has-a」の関係に見えます。アプリを再設計することを検討してください。そうしないと、さらに奇妙な問題に直面することになります

于 2012-07-31T03:19:47.943 に答える