构造函数的巨型开关语句

Giant switch statement for constructors

本文关键字:语句 开关 巨型 构造函数      更新时间:2023-10-16

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

现在,我有一个像这样的大开关语句:

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:
        ...
    }
}

我想知道是否有更好的方法来设计这个。我不知道很多"设计模式"(我想它们就是这么叫的),所以我不知道是否有(明显的)更好的方法来设计这个

您正在寻找的是工厂方法模式

这里重要的是消除了基类对派生类实现的任何知识的需要。基类拥有关于派生类的知识是一种糟糕的设计。

工厂方法模式解决了上述问题,因为创建发生在基类之外。

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

另一种方法是创建一个数组,在其中放置指向将调用相应构造函数的函数的指针。在depends()中,您只会调用给定输入所需的函数。但无论如何,这种方法需要26个函数

整型参数"input"来自某个地方。你也许可以让创建int的代码来创建实际的对象。如果你从磁盘或类似的地方读取int值,这将不起作用。

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