我知道静态方法不能是abstracted它们也不能被覆盖,only hidden (and in which case late bindings don't happen) .关于这一点,我正在努力寻找一种逻辑方式来表达以下关系:
public abstract class Spell {
protected int power;
public Spell(int power) {
this.power = power;
}
public int getPower() { return power; }
// I know this is impossible, but please bare with me
public abstract static int getMaxPower();
}
public class AttackSpell extends Spell {
public AttackSpell(int power) {
super(power);
}
public static int getMaxPower() { return 50; }
}
public class HealSpell extends Spell {
public HealSpell(int power) {
super(power);
}
public static int getMaxPower() { return 30; }
}
在这个人为的例子中,最大功率是我希望每个法术都知道的属性(Spell
的每个子类都有一个适用于其自身所有实例的单独最大功率)。在其他 SO 线程中,针对这种不可能情况的建议解决方案是使 getMaxPower()
成为实例方法。但是,我认为这没有意义,因为功率是一个实现细节,在实例化之前了解它很有用(例如,构建一个从功率 1 到该法术最大功率的法术实例数组)。
我看到的一个解决方案是为每个法术创建一个工厂(或为所有法术创建一个更通用的工厂),它有一个实例方法 getMaxPower()
知道法术的最大功率属性它实例化。但是,这对我来说似乎也不是最佳选择,因为:
- 了解每个咒语的属性更有意义
- 这使得 Spell 的子类忽略了实现细节(即,其构造函数无法检查提供的功率是否超过其最大功率)
工厂模式是正确的做法吗?如果是这样,它的逻辑依据是什么?如果不是,是否有更适合这个问题的模式?
最佳答案
我的第一个想法是断开生成法术和法术。
有一个描述法术系列和能量范围的类,然后使用它来创建范围内的法术集合,通过构造函数传递能量等。
然后您可以考虑某种数据文件,从而节省大量硬编码。
关于java - 避免抽象静态方法(或覆盖静态方法)的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20838135/