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

时间:2017-11-30 19:34:49

标签: java minecraft

TLDR:我将数据传递给mob的实例化。该实例化过程的一部分涉及为暴徒实例化AI。我想把传递给暴徒的数据传递给暴民的AI。这很难,因为强迫Super()调用等等。

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

我已经编写了自己的路径追踪器(实体用来导航世界的AI目标)。然后我带了一个现有的暴徒(在这种情况下是一头牛)并擦除了它的正常AI并用我自己的替换它: PathFinderGoalRpgMeleeAttack

我想创建我的牛的新实例(即 RpgCow rpgCow = new rpgCow(damage,knockback))。

问题在于,当我实例化一个新的暴徒(扩展另一个类时记得)时,我被迫调用super()。 super方法调用方法r()(我重写它以添加我自己的AI)。由于super()调用r(), damage knockback 的值仍然是0.0和0.0(double的默认java值)因为损坏和回击没有有可能被设定。

有关如何解决这个问题并将我传入牛创建的数据插入到PathFinder创建中的任何想法?

我听说过抽象或反思可能是一件好事,但只是阅读这两个主题的文档,似乎都不会对我有所帮助。

编辑,因为我猜我不是那么清楚: 问题是当我将它们传递给路径查找器时,Damage和Knockback的值仍为0,这意味着稍后当我在我的路径查找器中执行this.getDamage时,无论我在创建损坏和击退时传递给暴徒的值是什么永远是0。

代码:

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);
        }

    }
}

1 个答案:

答案 0 :(得分:1)

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

这可能是比在super()调用之后调用子类(RpgCow)的构造函数中的r()更好的解决方案,这取决于你的实现,应该覆盖在set中设置的`cow.goalselector'。你的超级()电话。

这将要求你让超级类是抽象的,但是当你用实体/怪物编写游戏时,拥有一个抽象基类是你可能想要的功能。

编辑:另一种方法是将你想要的AI传递给超类的构造函数并传递给r(),如果它是null,则执行基类的功能,否则分配新的AI 。接口可以是多态化AI对象的便捷方式。