首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类的Java实例

类的Java实例
EN

Stack Overflow用户
提问于 2017-12-10 12:17:05
回答 1查看 100关注 0票数 1

我有以下类结构扩展: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次检查。你有什么办法解决这个问题吗?

编辑添加的代码

代码语言:javascript
运行
复制
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()之类的事情

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-10 12:44:32

您的方法可以这样编写:

代码语言:javascript
运行
复制
private void castSpecial() {
    if (player instanceof iCastable) {
        ((iCastable) player).castSpecial();
    }
}

instanceof执行运行时检查,以查看Player实例是否具有正确的子类。如果检查成功,类型转换也将成功。(如果您在没有“保护”的情况下执行类型强制转换,那么如果播放机没有所需的类型,它将抛出一个ClassCastException。)

显然,如果player没有拼写转换能力,则该方法什么也不做。

注意:从两个角度看,接口名iCastable是错误的。

  1. 类或接口名应该是,而不是以小写字母开头的
  2. 名字是错的。ICastable意味着您将“转换”一个Mage。事实上,Mage是施展法术的对象,而不是施法的咒语。一个更好的名字可能是ISpellCaster
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47738737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档