我有以下类结构扩展:Entity > Creature >(抽象)Player> Mage。在Mage类中,我用方法castSpell()实现了接口iCastable。在主要方法中,我创建了new Mage(...)。
问题是,当我将它作为Player类someMethod(Player player)的支柱发送时,我不能使用从接口iCastable实现的方法。我只能通过Creature类通过player.getCreaure.whaterver()使用方法,因为Player对它进行了扩展。我怎样才能解决这个问题?
我不想把它作为Mage类的支柱发送,因为我想使用其他所有类,比如Warrior。我还想避免player instanceof Mage,因为如果我有1000个类,我必须对每个方法进行1000次检查。你有什么办法解决这个问题吗?
编辑添加的代码
public class Creature extends Entity {...}
public abstract class Player extends Creature {
    public Player(String name) {
        super(name);
    }
    public abstract void attack();
}
public class Mage extends Player implements iCastable {
    ...
    @Override
    public void castSpecial() {...}
}
public static void main(String[] args) {
   Mage mage = new Mage("Mage");
   Duel duel = new Duel(mage, monsters);
}
public class Duel {
    private Player player;
    ...
    public Duel(Player player, ArrayList<Monster> monsters) {
        this.player = player;
        ...
    }
    private void castSpecial() {
        // error here
        player.castSpecial();
    }
}我试着做一些像player.getInstanceClass(法师,战士或其他什么).cashSpecial()之类的事情
发布于 2017-12-10 12:44:32
您的方法可以这样编写:
private void castSpecial() {
    if (player instanceof iCastable) {
        ((iCastable) player).castSpecial();
    }
}instanceof执行运行时检查,以查看Player实例是否具有正确的子类。如果检查成功,类型转换也将成功。(如果您在没有“保护”的情况下执行类型强制转换,那么如果播放机没有所需的类型,它将抛出一个ClassCastException。)
显然,如果player没有拼写转换能力,则该方法什么也不做。
注意:从两个角度看,接口名iCastable是错误的。
ICastable意味着您将“转换”一个Mage。事实上,Mage是施展法术的对象,而不是施法的咒语。一个更好的名字可能是ISpellCaster。https://stackoverflow.com/questions/47738737
复制相似问题