1

配列リストで使用されている他のクラスを拡張するクラス外の変数にアクセスするにはどうすればよいですか? 変数が拡張クラスに存在しないというエラーが表示されます。Object クラスで変数を宣言せずに、変数メンバーにアクセスしたいと考えています。

public abstract class Object {
    public int x, y;
}

public class House extends Object {
    public int members = 10;
}

// Somewhere else
ArrayList<Object> list = new ArrayList<Object>();
list.add( new House() );
for (Object o : list ) {
    o.members;
}

問題は、私が書いている RTS では、Object クラスに 40 を超える変数があることです。サブクラスだけで変数を宣言して、外部からアクセスするだけではうまくいかないからです。ご理解いただければ幸いです。これどうやってするの?

4

5 に答える 5

8

instanceofキャストを使用できます:

for (Object o : list ) {
    if (o instanceof House) {
        h = (House) o;
        h.members;
    }
}

ただし、これはしばしば悪い設計と見なされます。で適切なメソッドを定義することを検討する必要がありますObject(他の人が指摘したように、実際Houseには別の名前を付ける必要があります) でそれをオーバーライドします。次に、そのメソッドがObject参照するオブジェクトの種類を知らずに でそのメソッドを呼び出すことができます。それが である場合はHouse、正しいメソッドが呼び出されます。(これを適切に実行する方法と、いつ実行するかを学ぶには、少し練習が必要です - Googleポリモーフィオーバーライド.)

于 2013-05-16T14:11:04.943 に答える
3

まず、クラスに名前を付けないでくださいObject(コメントを参照してください)。オブジェクトにはフィールドがないため、コード内で にmemberアクセスできません。ただし、は である必要はないため、 であるとは限りません。ObjectmemberHouseObjectHousemember

この場合、 youreObject常にであると確信している場合は、次のようHouseにキャストします。

    ((House) anObject).member;

このようにして、コンパイラはオブジェクトの実際のクラスについてあなたが知っている以上のことをあなたが知っていると想定し、あたかもそれがHouse. instanceofキャストが有効かどうかを確認するために使用できます。

于 2013-05-16T14:12:40.213 に答える
0

クラスの名前を「オブジェクト」として使用していることを理解していただければ幸いです。これは、Java のすべてのクラスの親クラスです。これで、あなたの環境には、Java が java.lang.Object から提供するものと、作成したものとの 2 つのオブジェクト クラスが存在します。したがって、クラス オブジェクトにアクセスしてその属性を取得しようとすると、実際にはクラス オブジェクトではなく、java.lang.Object のインスタンスであるため、問題が発生します。

于 2013-05-16T14:10:26.363 に答える
0

このようにarraylistのメンバーをキャストするだけです

((House)o).members;
于 2013-05-16T14:12:11.507 に答える
0

o を House にキャストする必要があります。例えば((House) o).members

于 2013-05-16T14:11:38.270 に答える