构造函数的巨型switch语句

时间:2011-07-16 05:41:55

标签: c++ inheritance switch-statement class-hierarchy construction

我有一个容器,它包含一堆指向基类的指针,以及一个接受一些输入并返回一个类的函数,该类是基类的子类。它返回的子类取决于输入。

现在,我有一个像这样的巨型开关声明:

class Base { ... }

class A : public Base { ... }
class B : public Base { ... }
...
class Z : public Base { ... }

Base* depends(int input) {
    switch (input) {
    case 1:
        return new A(...);
    case 2:
        return new B(...);
    ...
    case 26:
        return new Z(...);
    default:
        ...
    }
}

我想知道是否有更好的方法来设计它。我不知道很多“设计模式”(我认为这就是他们所谓的)所以我不知道是否有一种(明显的)更好的方法来设计它。

4 个答案:

答案 0 :(得分:6)

您要找的是 Factory Method pattern

这里重要的是消除Base类需要了解派生类实现的知识。对于Base类来说,了解Derived类是一个糟糕的设计。

Factory Method模式解决了上述问题,因为创建发生在Base类之外。

答案 1 :(得分:1)

有点难以弄清楚你想要的是什么,但如果你想根据一些输入参数创建一堆不同的子类,你可能想要考虑一个抽象工厂模式。

答案 2 :(得分:1)

另一种方法是创建一个数组,您将指向将调用相应构造函数的函数的指针。在您的depends()中,您只需通过给定的输入调用您需要的函数。但是在这种方法中你需要26种功能

答案 3 :(得分:1)

整数参数“input”来自某个地方。您可以让创建该int的代码改为创建实际对象。如果从磁盘或类似的东西读取int,那将无效。

您可以考虑设置一种情况,其中不同的子类将自己注册到创建它们的对象。在这种情况下,工厂对象在编译时不需要知道子类。您可以在启动时使用全局变量完成此操作,其构造函数会为每个子类进行注册。您的switch语句更简单,更快,但它确实意味着您必须在更改子类时保持交换机的最新状态。这是一种权衡,我不认为你的解决方案必然不如一个更精细的解决方案。