Java 对于使用抽象类的子类,如何限制抽象类中方法的参数?
我一直在尝试设计一组类来模拟一个经典的RPG。然而,我发现自己对如何解决这一问题感到困惑:如何在抽象类中强制使用特定于角色类型(例如坦克、治疗者、DPS)的法术/装备等。下面的例子更好地阐明了我的意思 我有一个抽象的Java 对于使用抽象类的子类,如何限制抽象类中方法的参数?,java,oop,inheritance,polymorphism,Java,Oop,Inheritance,Polymorphism,我一直在尝试设计一组类来模拟一个经典的RPG。然而,我发现自己对如何解决这一问题感到困惑:如何在抽象类中强制使用特定于角色类型(例如坦克、治疗者、DPS)的法术/装备等。下面的例子更好地阐明了我的意思 我有一个抽象的PlayableCharacter类,所有角色类型都从该类继承: public abstract class PlayableCharacter { private Set<Spell> mSpells; ... public void add
PlayableCharacter
类,所有角色类型都从该类继承:
public abstract class PlayableCharacter {
private Set<Spell> mSpells;
...
public void addSpell(Spell spell) {
mSpells.add(spell);
}
}
注意抽象类中拼写的集合
。我希望PlayableCharacter
的每个子类都可以使用其addSpell
方法,但限制是Spell
的类型对应于PlayableCharacter
子类型。
例如,我有以下拼写类:
public abstract class Spell { ... }
public class HealerSpell extends Spell { ... }
public class TankSpell extends Spell { ... }
我只希望治疗者
使用治疗法术
和坦克
使用坦克法术
,等等。例如:
public class Healer extends PlayableCharacter { ... }
public class Tank extends PlayableCharacter { ... }
PlayableCharacter tank = new Tank();
tank.addSpell(new TankSpell()); // This is fine
tank.addSpell(new HealerSpell()); // I want to prevent this!
我曾想过给可玩角色的每个子类赋予它自己的集合
特定于子类的拼写
,但这会造成大量代码重复
我还尝试将PlayableCharacter.addSpell
标记为protected,然后每个子类都必须实现如下接口:
public interface Spellable<T extends Spell> { void addClassSpell(T spell); }
公共接口可拼写{void addClassSpell(T spell);}
实现它的每个子类都将调用super.addSpell(拼写)代码>但是这会导致更多的代码重复,并且没有任何东西迫使这些实现执行super
调用
我的策略在某些方面存在根本性缺陷吗?有什么建议吗?我觉得这个问题会越来越严重,因为我添加了更多特定于角色类型的装备、特征等等。到目前为止,你所拥有的一切都是好的
其他的东西,考虑更多的战略模式,而不是超级呼叫
所以抽象类可以有执行步骤1、步骤2、步骤3的算法以及可能的父实现
子类可以重写它,但只能重写不同的部分
当您调用算法时,它将执行所有步骤
步骤本身可以是具有逻辑的不同类,如果所有内容都变得太大可能会让可播放角色的每个子类存储允许的子单元类。然后做一个if(allowedSpell的拼写实例).我不会那样做(通过类型继承)。最好在咒语本身添加特征,因为它是一个咒语,只能由某个角色施放。同样,一个特定的咒语只能被施展到某个角色类型。这些规则属于咒语,而不是角色
拼写规则可以在运行时由单独的类检查,也可以由cast()
方法或其他方法中的拼写类本身检查