【发布时间】:2017-01-04 02:47:01
【问题描述】:
我一直在尝试设计一组类来模拟经典 RPG。然而,我发现自己对如何解决这个问题感到困惑:如何在抽象类中强制使用角色类型(例如坦克、治疗师、DPS)特定的法术/设备等。下面的例子更好地表达了我的意思。
我有一个抽象的 PlayableCharacter 类,所有字符类型都继承自:
public abstract class PlayableCharacter {
private Set<Spell> mSpells;
...
public void addSpell(Spell spell) {
mSpells.add(spell);
}
}
例如:
public class Healer extends PlayableCharacter { ... }
public class Tank extends PlayableCharacter { ... }
注意抽象类中Spell 的Set。我希望PlayableCharacter 的每个子类都可以使用它的addSpell 方法但限制Spell 的类型对应于PlayableCharacter 子类型。
例如我有这些Spell 类:
public abstract class Spell { ... }
public class HealerSpell extends Spell { ... }
public class TankSpell extends Spell { ... }
我只希望Healers使用HealerSpells和Tanks使用TankSpells等例如:
PlayableCharacter tank = new Tank();
tank.addSpell(new TankSpell()); // This is fine
tank.addSpell(new HealerSpell()); // I want to prevent this!
我想为PlayableCharacter 的每个子类赋予它自己的Set 和特定于子类的Spells,但这会产生很多代码重复。
我还尝试将PlayableCharacter.addSpell 标记为受保护,然后每个子类都必须实现这样的接口:
public interface Spellable<T extends Spell> { void addClassSpell(T spell); }
实现它的每个子类都会调用super.addSpell(spell);,但这会导致更多的代码重复,并且没有什么会迫使这些实现调用super。
我的策略在某些方面存在根本缺陷吗?有什么建议吗?随着我添加更多特定于角色类型的装备、特性等,我觉得这个问题会越来越严重。
【问题讨论】:
标签: java oop inheritance polymorphism