子类列表"master copies",寻找更好的设计



我最近参与了一个小型游戏项目,在该项目中,玩家将在某个时刻获得一个随机项目。这些项(大约50个)被实现为虚拟Item接口的子类。我们需要一种方法来随机选择其中一个项目,并为玩家提供特定类的实例。

我们的解决方案是创建一些容器(例如std::list),并插入我们实现的每个项的实例。项目实现必须提供一个复制构造函数,这样我们就可以为获得该项目的玩家创建一个副本。瞧!

缺点很明显:很容易忘记插入项,而对复制构造函数的疏忽可能会导致不那么容易跟踪的错误。由于这是原型代码,我们没有太多麻烦,但我想知道是否有更漂亮的方法。理想的解决方案包括:

  1. 在某处自动"注册"项目
  2. 一种随机选择一个项目并实例化它的方法
  3. 无需为每个项编写复制构造函数

感谢您的提示和建议!

Daerst

您可以创建一个工厂来创建项目。然后,工厂还会在容器中注册创建项。我想为玩家使用共享指针!但这取决于你。

通过这种方式,您可以确保项目将通过单个界面创建。而且用于插入项目等的通用逻辑也是在一个地方实现的。

您的问题中有一些细节不清楚。例如,根据我对你的问题的解释,你似乎在硬编码你的物品的细节?基于你目前的原型是硬编码你的游戏物品的细节的假设,我会:

  1. 将内容与代码分离-这一点很重要,因为更改内容值需要重新编译,或者更重要的是,项目总数的扩展很快就会变得繁重且容易出错。

  2. 创建一个泛型类,该类表示一个具有所有适当字段的项,这些字段是用该项的相关详细信息填充该项类所必需的。

2A。若你们的项目并没有相似的属性,你们可以使用某种自定义方面的自我描述数组。例如,项目A是唯一的,并且具有风味特性。你会有一个二维数组[1][2],它的值是[1][1]=味道[1][2]=蓝莓。

  1. 创建一个充当项容器的类。

  2. 在容器类中,实现一个方法来实例化一个随机项(从数据库或其他存储机制中提取有关该项的详细信息),并将其添加到"已加载项"的容器集合中-有效地"注册"它。拥有这个容器类的两个明显好处是,一旦加载了一个项,如果你选择另一个随机项目,恰好是已经加载的项目,你不必再加载它。其次,在加载完整个项目集之前,你使用的内存更少。

  3. 在容器类中,实现一个将实例化项复制到播放器类的方法。-或者,在容器类中创建一个接口,玩家类实现该接口来请求一个新的随机项,然后调用该方法来实例化一个随机项。

希望这对你的头脑风暴有所帮助!

  1. 将项添加到Item类的constructor内的vector中。这样你就不需要"手工"添加每一个项目,它们将在创建时添加
  2. 与其复制项,不如让它们成为singleton类,而不是"给"用户一个项,只需使用指向vector中某个位置的指针

也就是说,你的问题与游戏的糟糕设计密切相关。项不应该是派生类,而应该是泛型项类的实例。但既然其他人已经提到了,我认为再输入一次对你没有任何帮助:)

最新更新