1

わかりましたので、私はこのようなクラスの大きな構造を持っています

それは学校用で、私のインストラクターはスタークラフトが好きなので、それで行きましょう.

とにかく、新しいMarineオブジェクトをインスタンス化できると思われるGeneratorBuildingクラスのメソッドがあります。ただし、海兵隊のオブジェクトにかかるリソースの数を知る必要があります。

unitCost() という抽象Unitクラスに抽象 int メソッドがあります。その後、Marineクラスはこのメソッドをオーバーライドし、50 などの値を返します。

特定の Marine オブジェクトを呼び出さずに、私のGeneratorBuildingクラスがMarineクラスの unitCost() メソッドの戻り値を取得する方法を探しています。

おそらく海洋オブジェクトを作成し、そのコストを尋ねて、リソースがない場合はオブジェクトを ArrayList にプッシュする代わりに削除することができることを知っています。しかし、これはほとんど回避策のようです。

編集:全体のポイントは、すべての具象クラスが UnitCost() メソッドを継承およびオーバーライドできるようにすることです。だから私はそれを静的にすることができましたが、それは継承構造の要点全体を台無しにします...

EDIT2:サンプルコードのリクエストがあったため(想像するのは難しいことではありません)

public void makeMarine(){

    //uses resources and throws exception etc if there are not enough resources
    Game.useResources(Marine.unitCost());

    //creates a marine
    Game.addMarine();
}
4

3 に答える 3

2

これを行うには、各クラスで特定の名前の静的フィールドを宣言し、リフレクションを通じて取得します。

クラスが次のようになっているとします。

class ClassNumber1 {
    public static final int cost = 123;
}
class ClassNumber2 {
    public static final int cost = 321;
}

cost次に、次のようにフィールドを取得できます。

public static <T> int getCost(Class<T> cl) throws Exception {
    // This is oversimplified: you need to check that the class
    // indeed has a field called "cost" by null-checking the return value
    // of getField(), verifying your cast, catching exceptions, and so on.
    // But this will work in a "closed" system, when you know for sure
    // that an int constant field does exist:
    return (int)cl.getField("cost").get(null);
}

次のようにメソッドを呼び出します。

System.out.println(getCost(ClassNumber1.class));
System.out.println(getCost(ClassNumber2.class));

これはideoneのデモです。

于 2013-04-19T01:45:43.133 に答える
0

これはまさにクラスメソッドの目的です。クラス メソッドでは、unitCost() は Marine クラス自体のメソッド (つまり static public int UnitCost()) であるため、m =new Marine() と m.UnitCost() ではなく、Marine.unitCost() を呼び出すことができます。 )。

クールなインストラクター。OOを服用していたときに1つ持っていたらよかったのに。

于 2013-04-19T01:36:04.820 に答える