Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于使用抽象类的子类,如何限制抽象类中方法的参数?_Java_Oop_Inheritance_Polymorphism - Fatal编程技术网

Java 对于使用抽象类的子类,如何限制抽象类中方法的参数?

Java 对于使用抽象类的子类,如何限制抽象类中方法的参数?,java,oop,inheritance,polymorphism,Java,Oop,Inheritance,Polymorphism,我一直在尝试设计一组类来模拟一个经典的RPG。然而,我发现自己对如何解决这一问题感到困惑:如何在抽象类中强制使用特定于角色类型(例如坦克、治疗者、DPS)的法术/装备等。下面的例子更好地阐明了我的意思 我有一个抽象的PlayableCharacter类,所有角色类型都从该类继承: public abstract class PlayableCharacter { private Set<Spell> mSpells; ... public void add

我一直在尝试设计一组类来模拟一个经典的RPG。然而,我发现自己对如何解决这一问题感到困惑:如何在抽象类中强制使用特定于角色类型(例如坦克、治疗者、DPS)的法术/装备等。下面的例子更好地阐明了我的意思

我有一个抽象的
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()
方法或其他方法中的拼写类本身检查