首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将变量通过超级()调用实例化后传递给对象?

如何将变量通过超级()调用实例化后传递给对象?
EN

Stack Overflow用户
提问于 2017-11-30 19:34:48
回答 1查看 89关注 0票数 0

TLDR: I将数据传递给暴徒的实例化。该实例化过程的一部分涉及为暴徒实例化AI。我希望我传递给暴民的数据被传递给暴民的人工智能。这是很困难的,因为除了其他之外,还有一个强制的Super()调用。

的故事:,我是在游戏中创建自己版本的怪物。

我编写了自己的pathFinders (实体用来导航世界的人工智能目标)。然后,我拿了一个现有的暴民(在这个例子中是一头牛),抹去了它正常的人工智能,用我自己的: PathFinderGoalRpgMeleeAttack代替了它。

我想要创建我的牛的新实例(即RpgCow rpgCow =新的rpgCow(损坏,回扣))。

问题是,当我实例化一个新的暴徒(它扩展了另一个类--记住)时,我被迫调用super()。超级方法调用r()方法(我重写该方法以添加自己的AI)。由于超级()调用r(),损伤和回扣的值仍然是0.0和0.0 (默认的java值为double),因为损坏和回扣还没有被设置的机会。

对于如何绕过这一问题并将传递给牛的数据插入到PathFinder创建中,有什么想法吗?

我听说抽象或反思可能是一件很好的事情,但是仅仅阅读关于这两个主题的文档,似乎对我没有任何帮助。

编辑,因为我想我不是那么清楚:问题是,当我将它们传递到PathFinder中时,损伤和回扣的值仍然是0,这意味着以后当我在我的pathFinder中执行this.getDamage时,不管我在创建时传递给暴民的是什么值,伤害和回扣总是为0。

代码:

代码语言:javascript
复制
public class RpgCow extends EntityCow
{
    private double damage;
    private double knockback;

    public RpgCow(World world, double damage, double knockback)
    {
        super(world);
        this.damage = damage;
        this.knockback = knockback;
        this.bukkitEntity = new CraftRpgCow(this.world.getServer(), this);
    }

    @Override
    protected void r()
    {
        this.goalSelector.a(3,new PathFinderGoalRpgMeleeAttack(this,damage,knockback));
    }

    private static class CraftRpgCow extends CraftCow
    {

        private CraftRpgCow(CraftServer server, EntityCow parent)
        {
            super(server, parent);
        }

    }
}
EN

回答 1

Stack Overflow用户

发布于 2017-11-30 19:45:31

如果在超类中对r()进行方法定义,那么r()的任何调用都将使用实例的实现,即使它是在超类的构造函数中调用的。

这可能是一个比在超级()调用之后在子类(RpgCow)的构造函数中调用r()更好的解决方案,根据您的实现,该调用应该覆盖在super()调用中设置的`cow.goalselector‘。

这将要求您的超类是抽象的,但是当您正在用实体/群体编写游戏时,拥有抽象基类是您可能想要的功能。

编辑:另一种方法是将你想要的AI传递给超类的构造函数和r(),如果它是空的,那么执行基类的功能,否则就分配新的AI。接口将是一个方便的方式,使人工智能对象的多形性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47581281

复制
相关文章

相似问题

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