假设您有一些用于存储游戏中攻击信息的类(这不是我的用例,但实际上是类似的,也是我能想到的最容易理解的类比)。每次攻击都有一个名称(String)和一个strength(int)(可能还有其他字段,但这只是一个例子)。并且您想要某种方式来访问有关游戏中每一步的信息。
对我来说,这很简单,可以使用Attack
类来实现,然后将每个攻击作为Attack
的最终实例存储在某些常量类Attacks
中。
但是假设某些动作的strength
在某些情况下会发生变化。对于非平凡的行为,我想可能需要一个特定的方法,它采用参数(发生所述变化的“情况”)会产生一些额外的影响,例如在某些情况下具有更高的strength
,或者治愈用户,或削弱目标等。
我正在寻找解决需要什么是有效常量的问题的解决方案(所有攻击都严格按照行为进行定义),但有些人使用“可选”方法。
我已经考虑过使用功能接口/对象作为将这些方法“传递”到实际处理这些攻击使用的类的方法,但这看起来很笨拙,而且可能缺乏灵活性。
另一种可能的解决方案是拥有一个抽象的Attack
类,其中包含必要的字段(name
,strength
等)以及指示是否表示给定攻击具有某种属性(所有不同的可能属性都存储在enum
抽象类中的Attack
中。然后,每个移动都将作为Attack
的子类实现,其方法对应于上述集合中存在的每个属性。该解决方案提供了很大的灵活性,但是每个单独的移动都需要单独的类,这必须在存储和内存中收集(可能作为地图或集合)。
对这些想法或完全新想法的任何反馈都将不胜感激。
答案 0 :(得分:6)
这是Java中 enum 的完美用法。您有少量固定数量的攻击类型,需要进行多态处理,并且需要自定义行为。
简单示例:
public enum Attack {
MELEE(2) {
@Override
public int getDamage(int circumstances) {
// customized behavior
}
},
RANGED(1);
private final int baseStrength;
private Attack(int strength) {
this.baseStrength = strength;
}
public int getDamage(int circumstances) {
// default behavior for all attacks
}
}