如何处理状态转换,并用多态类型替换“if”语句?

时间:2010-06-21 20:16:23

标签: c++ qt oop polymorphism

最近我正在听一个关于清洁编码的技术讲座。演讲者是一名测试工程师,他强调避免代码中的“if”语句并尽可能多地使用多态。他也主张反对全球各州。

我完全赞同他,但我需要澄清在以下情况中使用多态替换全局状态和“if”语句,

我的文件中有3个州。我想根据文档状态更改UI组件的状态。现在,我使用“if”块和一个包含当前文档状态的枚举类型来转换UI组件的状态。

例如:

enum DOC_STATE
{
DOC_STATE_A = 0,
DOC_STATE_B,
DOC_STATE_C
};

void QMainWindow::handleUi(_docState)
{
switch(_docState)
{
case (DOC_STATE_A):
{
menu.disable();
....
}
case (DOC_STATE_B):
{
menu.enable();
...
}
case (DOC_STATE_C):
{
...
}
}

我认为我可以为每个状态分别设置子类,并在每个类中使用handleUI()方法。调用handleUi()方法调用正确的方法调用。但是说我在我的文档中维护这些对象,每次状态转换时如何从一个对象切换到另一个对象?

换句话说,如何通过跟踪文档状态的变化而不使用全局状态和“if”或Switch语句来处理UI转换?

我使用Qt。感谢。

2 个答案:

答案 0 :(得分:2)

如果您使用的是Qt,请查看The Qt State Machine FrameworkState Machine Examples。当您的框架已经提供跑车时,无需重新发明轮子:)

答案 1 :(得分:0)

我认为我不理解这个问题,因为答案太简单了:用新状态实例替换指向状态实例的指针并丢弃旧实例。