我一直在尝试设计一组类来模拟一个经典的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
的 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
标记为protected,则每个子类都必须实现如下接口:
public interface Spellable<T extends Spell> { void addClassSpell(T spell); }
实现它的每个子类都会调用 super.addSpell(spell);
但这会导致更多的代码重复,而且没有什么能迫使这些实现做同样的事情 super
打电话。
我的策略在某些方面存在根本性的缺陷吗?有什么建议吗?我觉得这个问题会越来越严重,因为我添加了更多特定于角色类型的装备、特质等等。
3条答案
按热度按时间snz8szmq1#
到目前为止你的情况还不错
剩下的,多想想战略模式而不是超级呼叫
所以抽象类可以有执行步骤1,步骤2,步骤3的算法和可能的父实现
子类可以重写它,但只能重写不同的部分
当您调用算法时,它将执行所有步骤
如果一切都变得太大,步骤本身可以是不同的具有逻辑的类
gcmastyq2#
可以让每个可玩角色的子类存储允许的子单元类。然后做一个if(allowedspell的咒语示例)。。。
2o7dmzc53#
我不会那样做(通过类型继承)。最好给咒语本身添加特征,因为它是一个咒语,只能由某个角色施法。另外,一个特定的咒语只能被施放到特定的角色类型。这些规则属于咒语,而不是角色。
拼写规则可以在运行时由一个单独的类检查,也可以由系统中的拼写类本身检查
cast()
方法或其他方法。