有很多子类的优雅代码?

时间:2014-02-12 12:49:29

标签: java enums subclass

我有一个有趣的编程问题让我难以忍受了好几天。一些背景来帮助我提出问题:

目前我正在编写一款游戏,使用Material Emum来保存游戏中所需的所有材料,即Material.DIRT,Material.WATER,Material.CLOTH ......

但是,我希望尽可能使代码具有可修改性,并且有能力让某人想要扩展游戏以添加他们可以执行的新材料。因此我当前的Enum系统崩溃了,所以我试图切换到Class / Subclass系统。我找到了两种方法,下面将介绍它们的优缺点。

案例1 - 具有抽象材料类和子类化。 因此,每种材料都会扩展材料。这是有利的,因为我们现在可以像材料一样“分组”,即织物可以延伸材料,然后羊毛和棉花等延伸这一点。这样做的问题在于,对于每种材料而言,必须存在一个类,并且对于每种材料具有如此少的参数,这感觉就像是浪费。如果有1000种材料,那么就会有1000种类,几乎没有任何内容。我可以通过匿名类来减少它,但现在代码无法区分一种材料与另一种材料。我可以使用id系统,这是案例2的主要问题。

案例1的问题是: 有更优雅的方式吗?

案例2 - 拥有一个Material类并将每个新材质实例化为此类的一个实例,用于定义具有不同id / name的每个材质。这节省了大量的写作,也使我们能够区分材料。这个问题现在我们有一个id系统,我们的基础是什么?字符串,整数?我问这个是因为我总是希望有一个复杂的免费系统,避免在代码中使用硬编码字符串和整数。这就是我喜欢enum的原因,因为不用担心排版。另一个问题是想要添加新材料的用户可能会与其他用户产生冲突的ID。

我对案例2的疑问是: 是否有完整的证明方法能够唯一且一致地区分实例(每个运行时都是相同的)?

感谢您的阅读。任何帮助或方法如何最好地做到这一点将是非常感谢。

编辑:我应该注意,某些材料可能有与之相关的方法和行为。某些行为可能对某些材料是唯一的,而某些行为对于“团体”则类似。

1 个答案:

答案 0 :(得分:2)

使用包含所有材料的配置文件,用一些DSL编写(基本上是简单的表格)。