2

C++ で行う通常の方法は次のとおりです。

class object
{
public:
     enum
     {
          STATE_ACTIVE = 0,
          STATE_INACTIVE,

          OBJ_NUM_STATES,
     }

     int   m_State;

     virtual void  UpdateState  ()
     {
           switch(this->m_state)
           {
           case STATE_ACTIVE:    /* do stuff*/    break;
           case STATE_INACTIVE:  /* do stuff*/    break;
           }
     }
}

class SpecialGameObject : public Object
{
public:
    enum
    {
         STATE_SPECIAL_A = OBJ_NUM_STATES + 1,
         STATE_SPECIAL_B,

         SPECIAL_NUM_STATES,
    }

    virtual void UpdateState ()
    {
         Object::UpdateState();

         switch(this->m_State)
         {
         case STATE_ACTIVE:       /* do extra stuff */   break;
         case STATE_SPECIAL_A:    /* do special stuff*/  break;
         case STATE_SPECIAL_B:    /* do special stuff*/  break;
         }
    }
}

この機能をすべてJavaで動作させる方法を見つけようとしています。具体的には、作業が必要です:

1) 派生クラスが、派生状態値の後に自動的に整列する状態値を持つ機能。こうすることで、派生クラスのいずれかで使用される状態値の範囲と重複することを心配することなく、基本クラスに新しい状態値を追加できます。

2) 状態値を switch ステートメントのケースとして使用する機能。

状態値を実装するために static final int を使用することを検討しました。ただし、これらは case ステートメントとして使用できません。次に、列挙型の拡張を調べましたが、それは許可されていません。

誰か私に提案はありますか?

ありがとうございました

4

5 に答える 5

2

これで十分ですか?

final class GameObject {

  enum State { ACTIVE, INACTIVE };

  State state;

  void updateState()
  {
    switch(state) {
      case ACTIVE :
        // update state
        break;
      case INACTIVE:
        // update STATE
        break;
      default:
        assert false : "never get here";
    }
  } 
}

Java では、enums はfinalenum を直接拡張できないので注意してください。( this SO question を参照してください。) 本当に状態の概念を特殊なサブクラスに拡張する必要がある場合は、必要なものを取得するために switch ステートメント(こちらも参照)ではなくポリモーフィズムを使用することを検討する必要があるほど複雑な場合があります。または、「スーパー」状態を、おそらく定義済みのインターフェースを使用して、ラッパーのスーパークラスとサブクラスの特殊なサブステートにバンドルすることもできます。

そして、本気で歪ませたいなら、こんなこともできます。Java列挙型がインターフェースを実装できることは非常にクールですが、これはあなたの質問に対してその機能を使用する特に醜い方法だと思います...

final class GameObject {

  ActiveStateful state;

  interface ActiveStateful {
    State activeState();
  }

  enum State implements ActiveStateful {
    ACTIVE, INACTIVE;

    public State activeState() {
      return this;
    }
  };

  enum SubState implements ActiveStateful {
    SPECIAL_A(State.ACTIVE), SPECIAL_B(State.ACTIVE);

    SubState(final State activeState) {
      this.activeState = activeState;
    }

    final State activeState;

    public State activeState() {
      return activeState;
    }

  }

}
于 2011-03-27T02:23:39.470 に答える
2

Java で状態パターンを実装する必要があります。これはあなたを助けるかもしれません。ウィキペディアには、Java での単純で理解しやすい例もあります。

于 2011-03-27T02:21:01.863 に答える
1
于 2011-03-27T09:53:02.410 に答える
1

switch ステートメントには列挙型とその序数値を使用することをお勧めします。それが列挙型が生まれた理由です。

于 2011-03-27T02:21:09.307 に答える
1

ただし、これらは case ステートメントとして使用できません。

もし私がこれが間違っていると言ったら、それであなたの問題は解決するでしょう?これは正しくありません: static final int 定数をオンにすることができます。

于 2011-03-27T02:22:57.407 に答える