股票清单 - 多态设计

时间:2013-02-06 13:24:23

标签: java polymorphism

(我使用Java因此添加了'Java'标签,因为它会影响任何答案,但有些人可能会认为标签是不必要的。)

请考虑以下事项:

我有一个阳台/阳台以图形方式进行规划。作为最终计划的一部分,我需要列出构建阳台所需的任何材料。为简化计算过程,我将阳台分为不同的部分

甲板以上 - 涉及塑料围栏组件和固定件(即螺钉,螺栓)
甲板以下 - 涉及木材副车架和更多固定件。

......还有其他我不会深入了解的内容。


为了论证:由于我们提供不同的击剑设计,因此有100种不同的库存物品可供使用。每个项目都有自己的类,包括尺寸,颜色,数量和ID参考等信息。

我想要做的是创建每个部分所需的修订列表,并将它们全部添加到一个最终列表中,不会有任何重复。
最后的想法是显示项目名称和处理计划旁边的数量。


例如:

第1节要求:
  - 25 x螺丝A
  - 15 x螺丝B
  - 5 x螺丝C

第2节要求:
  - 25 x螺丝A
  - 15 x螺丝B
  - 5 x螺丝F

第3节要求:
  - 45 x螺丝B
  - 50 x螺丝C
  - 24 x螺丝G

总列表
第1节+第2节+第3节= {完整的材料清单}


我尝试/考虑的内容:

我上面提到的所有螺丝都有自己的类,并扩展了超级“紧固件”。上面提到的每个部分都有一个变量:

ArrayList<Fasteners>

因此,我正在计算我可以为此变量添加螺钉。一旦每个部分计算出它需要多少个紧固件,我就完全添加它们。

我考虑在“紧固件”超级类中制作一个“添加(固定)”方法,将任何重复的项目添加到一起。但是因为有100个项目我会认为编码效率不高并且怀疑有更好的方法来利用我在这里设置的多态性。任何在线参考或提示都会有所帮助,非常感谢。

1 个答案:

答案 0 :(得分:1)

这是一个建议:

制作名为FastenerType的枚举,然后使用EnumMap<FastenerType, AtomicInteger>来固定紧固件。我们称之为袋子。

然后执行类似

的操作
public class FastenerBag {

  private Map<FastenerType, AtomicInteger> fasteners = new EnumMap<FastenerType, AtomicInteger>(FastenerType.map);

  FastenerBag(){
    // init your ints to zero
  }

  public void addFastenersFor(VerandaPart part){
    for (FastenerType type : FastenerType.values()){
      fasteners.get(type).addAndGet(part.getRequiredFasteners().get(type));
    }
  }

}

不要过分担心性能问题。首先让它工作。然后让它可读(重构),然后优化。