異なる機能を持つサブクラスを追加して、本当に大きな階層ツリーを持たずに共通の祖先を共有できるクラスを作成しようとすると、少し問題があります。特定のメソッドをオーバーライドする特定のクラスを呼び出すためのデザインパターン
n
は、Skill
インターフェイスの異なるサブクラスをリストに割り当てて実行するよう呼び出すことを試みています。 Skill
のすべてはEvent
のサブクラスです(ここではありません)。私はちょうどSkill
サブクラスを作成するために、右のそれを実行し、それが呼び出す必要がありますし、wheterそれがより効果だろうどのSkill
区別しませんかどこ
私の問題はSkillManager
に存在します。
これは私のSkill.classインタフェース
public abstract class Skill
{
/**
* Private shortcut so this code doesn't have to be reused over and over to call
* for cooldowns on the skills
* @param dp player making the request
* @return if the command is available for use
*/
protected boolean canUse(DPlayer dp){
String name = "skill_"+getName();
if(!dp.getTag(name).isPresent())
return false;
if(dp.getTag(name).get().getRemaining() > 0) {
dp.sendActionBarCooldown(ChatColor.AQUA + getName(), dp.getTag(name).get().getRemaining());
return false;
}
return true;
}
/**
* Returns the name of this skills, this should also be the same
* name of the class implementing this interface for initialization
* propouses
* @return name of skills
*/
public abstract String getName();
/**
* Executor to be implemented and replace/add functionality
*/
public abstract void execute();
}
ですこれはこれは、助けを
public class Sneak extends Skill {
@Override
public String getName() {
return "Sneak";
}
@Override
public void onSneak(DPlayer dp, PlayerToggleSneakEvent event){
if(dp.getTag("skills_sneak").isPresent()){
//DO STUFF
}
}
}
おかげ実装例Sneak.classである私のSkillManager.class
public class SkillManager
{
private static final SkillManager instance = new SkillManager();
private final List<Skill> SKILLS =new ArrayList<>();
private SkillManager(){}
public static SkillManager get(){return instance;}
public void registerSkill(Skill s){
SKILLS.add(s);
}
public void registerSkills(Skill... s){
for(Skill skill : s){
SKILLS.add(skill);
}
}
public void unregisterSkill(String name){
for(Skill skill : SKILLS){
if(skill.getName().equalsIgnoreCase(name)){
SKILLS.remove(skill);
}
}
}
public void callEvent(Skill skill) {
skill.execute();
}
}
です。 EDIT: Event
オブジェクトは私の実装ではなく、上記のイベントに関するデータを含んでいます。 EDIT 2:フローダイアグラムの追加。赤は私がコード化した部分です。ブルーは、私が
あなたの質問に直接関係はありませんが、あなたの例では 'Listスキル 'を静的メンバーにする必要はありません。 –
ありがとう@ChristopheWeis私は完全にそれをmissad – MartinStone