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 语句中使用状态值作为 case。

我研究了使用静态最终整数来实现我的状态值。但这些不能用作案例陈述。然后我研究了扩展枚举,但这是不允许的。

有人对我有什么建议吗?

谢谢

4

5 回答 5

2

您需要在 Java 中实现状态模式。这可能会帮助你。Wikipedia也有一个简单易懂的 Java 示例。

于 2011-03-27T02:21:01.863 回答
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 是final因此您不能直接扩展枚举。(参考这个 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 回答
1

我建议对 switch 语句使用枚举及其序数值。这就是 enum 的诞生目的。

于 2011-03-27T02:21:09.307 回答
1

但这些不能用作案例陈述。

如果我告诉你这是不正确的,那会解决你的问题,是吗?这是不正确的:您可以打开静态最终 int 常量。

于 2011-03-27T02:22:57.407 回答
1
于 2011-03-27T09:53:02.410 回答