如何在运行时在某些方法之间进行选择

How to choose between some methods at runtime?

本文关键字:之间 行选 方法 选择 运行时      更新时间:2023-10-16

为了让我的代码更清晰,我试图将一段长代码拆分为几个方法(有点像PHP)。

我有一个变量CurrentStep,指示要渲染的当前屏幕。

class Game
{
private:
    enum Step { Welcome = 0, Menu, };
    unsigned int CurrentStep;
}

现在我想在渲染帧时调用相应的方法:

void Game::RenderFrame
{
    switch (CurrentStep)
    {
    case Welcome:
        // the actual work is done by WelcomeScreen() to keep this clean
        WelcomeScreen(); break;
    case Menu:
        // same here
        MenuScreen(); break;
    }
}

我希望我努力实现的目标是可以理解的。最终,它应该调用适当的方法(在运行时)。

然而,这种方式只是多余的。。。使用C++难道没有"更好"的方法吗?

我想您正在寻找的是命令模式

阅读此详细解释(针对C++)

http://www.dreamincode.net/forums/topic/38412-the-command-pattern-c/

了解更多信息。

首先,您的私有变量应声明为Step CurrentStep;RenderFrame()需要括号。接下来,考虑到这个问题的普遍性和模糊性,很难给出具体的建议,但原则上你可以对继承做点什么:

class AbstractGameState
{
    virtual ~AbstractGameState() { }
    virtual void renderFrame() = 0;
};
class WelcomeScreenState : public AbstractGameState
{
  void renderFrame(); // implement!
};
class MenuState : public AbstractGameState
{
  void renderFrame(); // implement!
};
class Game
{
  std::vector<std::shared_ptr<AbstractGameState> > gameStates;
public:
  void renderFrame()
  {
    std::shared_ptr<AbstractGameState> state = getCurrentState(); // implement!
    state->renderFrame();
  }
};

我们需要更多信息。如果将RenderFrame设为虚拟函数,则可以使用运行时多态性来调用RenderFrame的正确大小写。

除了Kerrek发布的多态方法(有些人称之为经典的面向对象方法),还有其他技术不使用多态性。

  • 其中之一是表驱动方法

  • 另一个值得一提的是访问者模式,它已经在boost变体库中有效地实现了。这里有一个例子,显示了类似于你想做的事情

您还有多少其他状态?

WelcomeScreen()MenuScreen()的实现有什么共同点可以移动到一个公共基类中吗?

如果第一个问题的答案是"其他几个",或者第二个问题的回答是"不多",那么您的代码就可以了。如果可以的话,保持简单。

继承、命令模式和建议的其他方法会使代码稍微复杂一些,同时允许在未来添加更多状态时有更大的灵活性。你更了解你的应用程序,知道它的未来。