我一直在尝试设计一组类来模拟经典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 { ... }
请注意抽象类中Set
的{{1}}。我想如果Spell
的每个子类都可以使用其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);
调用。
我的策略在某种程度上是否存在根本缺陷?有什么建议?我觉得这个问题会随着我添加更多特定字符类型的设备,特性等而变得越来越糟。
答案 0 :(得分:1)
我不这样做(通过类型继承)。最好为法术本身添加特征,因为它是一个法术,只能通过某个角色施放。此外,特定法术可以仅转换为某种字符类型。这些规则属于咒语,而不属于角色。
可以在运行时通过单独的类或法术类本身在cast()
方法或其他方法中检查法术规则。
答案 1 :(得分:0)
到目前为止你所拥有的是好的
剩下的东西,想想比超级电话更多的策略模式
所以抽象类可以有算法执行step1,step2,step3和可能的父实现
子类可以覆盖它,但只覆盖不同的部分
当您调用算法时,它会执行所有步骤
如果一切都变得太大,步骤本身可能是具有逻辑的不同类
答案 2 :(得分:0)
可能有可玩角色的每个子类存储允许的子集的类(或类)。然后做一个if(allowedSpell的拼写实例)......