2011-06-23 18 views
0

から動的アルターサブクラス、:のJava - 次がある私は、クラスを持っているParentclass

final class Attributes { 

    Attribute agility; 
    Attribute endurance; 
    Attribute intelligence; 
    Attribute intuition; 
    Attribute luck; 
    Attribute speed; 
    Attribute strength; 

    private ArrayList<Attribute> attributes; 

    private boolean initialized = false; 

    public Attributes() throws IllegalAccessException { 
     initializeAttributes(); 
     store(); 
    } 

    public ArrayList<Attribute> getAttributes() { 
     return attributes; 
    } 

    private void initializeAttributes() { 
     if (!initialized) { 

      agility = new Agility(); 
      endurance = new Endurance(); 
      intelligence = new Intelligence(); 
      intuition = new Intuition(); 
      luck = new Luck(); 
      speed = new Speed(); 
      strength = new Strength(); 

      initialized = true; 
     } 
    } 

    private void store() throws IllegalAccessException { 
     Field[] fields = this.getClass().getDeclaredFields(); 

     attributes = new ArrayList<Attribute>(); 

     if (initialized) { 

      for (Field f : fields) { 
       if (f.getType() == Attribute.class) { 
        attributes.add((Attribute)f.get(this)); 
       } 
      } 
     } 
    } 

私の考えは何とかそうのような方法を使用することです:

public void setAttribute(Class attribute.getClass(), int value) { 

    } 

をこの方法では、呼び出し元は、変更する属性のタイプ(強度、インテリジェンスなど)を指定し、プロセスは、渡された属性サブクラスかどうかを識別することによって、操作する属性を決定するために、上記のベクターのサブクラスと同等であった。この場合、ベクター内のサブクラスが変更されます。

これは可能ですか? obj.getClass()/ getType()== obj2.getClass()/ getType()がサブクラスを考慮に入れているかどうかわからないため、私がこれを求めている主な理由です。

答えて

2

はい、できます。 obj.getClass()は、宣言する型objに関係なく、objの正確なクラスを返します。 私はあなたがリフレクションを使用していないとアドバイスしています。あなたが列挙型を持つ属性の継承を置き換えることができます。

enum Attribute { 
    STREGTH, AGILITY, SPEED, ...; 
} 

そして、のようなものがあります:あなたは基本的に探しているものを

public final class Attributes { 
    private Map<Attribute, Integer> attributes = new EnumMap(Attribute.class); 

    private void initializeAttributes() { 
     if (!initialized) { 
      for(Attribute att : Attribute.values()) { 
       attributes.put(att, 0); 
      } 
      initialized = true; 
     } 
    } 


    public void setAttribute(Attribute attribute, int value) { 
     attributes.put(attribute, value); 
    } 
} 
+0

「EnumMap」に言及するために+1 – Nick

+0

私はこれについて考えていましたが、列挙型で静的な値を必要としませんか?私は静的でないものが必要なので、同じ型の複数のインスタンスを持つことができます。そうでなければ、実際には機能しません。 – zeboidlund

0

Class.isAssignableFrom(...)です。現在のクラスが与えられたクラスのasパラメータと同じかスーパークラスかをチェックします。

あなたは単純に配列を反復処理し、重複している属性を削除して新しい属性を追加するだけです。

関連する問題