0

基本クラスで配列を宣言したいのですが、サブクラスでのみインスタンス化します。基本クラスでこの配列の長さを取得するようなことをする必要がありますが、null として表示されます。サブクラスをインスタンス化するだけです。どうにかしてこれを行うことはできますか?事前に助けてくれてありがとう...

public class A {  

protected int[] array;

    public void someMethod() {
        variable = array.length;
    }
}  

public class B extends A {  
    public void doSomething() {  
        array = new int[] { 1,2,3 };  
    }  
} 
4

2 に答える 2

2

A を抽象宣言できる場合は、このようにすることができます。

public abstract class A {  

    protected int[] array;

    public void someMethod() {
        int[] array = getArray();
        variable = array.length;
    }

    protected abstract int[] getArray();
}  

public class B extends A {  
    public int[] getArray() {
        if(array == null){
            array = new int[] { 1,2,3 };  
        }
        return array;
    }  
}

ただし、サブクラスから初期化される変数ホルダーとして A を使用しないでください。開発者はすべてのサブクラスを認識していない可能性があるため、配列を初期化するためにどのメソッドを呼び出すべきかわからないため、開発者は混乱する可能性があります。

より良いアプローチは、抽象メソッドを使用することです。

public abstract class A {  


    public void someMethod() {
        int[] array = getArray();
        variable = array.length;
    }

    protected abstract int[] getArray();
}  

public class B extends A {  

       private int[] array;

    public int[] getArray() {
        if(array == null){
            array = new int[] { 1,2,3 };  
        }
        return array;
    }  
}
于 2013-09-14T10:05:04.940 に答える
0

あなたの場合、適切なカプセル化が機能するはずです:

public class A {

  private final int[] array;

  public A(final int[] array) {
    this.array = array;
  }

  public int[] getArray() {
    return this.array;
  }

  // other methods...
}

public class B extends A {

  public B() {

    // instantiate the array
    super(new int[] {});
  }
}
于 2013-09-14T11:42:20.727 に答える