gpt4 book ai didi

java - 在通过 super() 调用实例化对象后,如何将变量传递到对象中?

转载 作者:行者123 更新时间:2023-12-02 11:56:15 24 4
gpt4 key购买 nike

TLDR:我将数据传递到生物的实例化中。该实例化过程的一部分涉及为暴徒实例化人工智能。我希望将我传递给生物的数据传递给生物的人工智能。由于强制 Super() 调用等原因,这很困难。

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

我已经为自己编写了pathFinders(实体用来导航世界的AI目标)。然后我拿了一个现有的生物(在本例中是一头牛)并删除了它的正常 AI 并用我自己的替换它:PathFinderGoalRpgMeleeAttack

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

问题是,当我实例化一个新的生物(记住它扩展了另一个类)时,我被迫调用 super()。 super 方法调用方法 r() (我重写该方法以添加我自己的 AI)。由于 super() 调用了 r(),damageknockback 的值仍然是 0.0 和 0.0(double 的默认 java 值),因为damage 和 knockback 没有尚未确定的机会。

关于如何解决这个问题并将我传递到奶牛创建中的数据插入到 PathFinder 创建中,有什么想法吗?

我听说抽象或反射可能是一件值得研究的好事情,但仅仅阅读有关这两个主题的文档似乎都对我没有帮助。

编辑,因为我想我不太清楚:问题是,当我将伤害和击退传递到路径查找器时,它们的值仍然为 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);
}

}
}

最佳答案

如果您在父类(super class)中将 r() 方法定义为抽象,则对 r() 的任何调用都将使用它的实例实现,即使它是在父类(super class)的构造函数中调用的。

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

这将要求您的父类(super class)是抽象的,但是当您使用实体/生物编写游戏时,拥有抽象基类是您可能想要的功能。

编辑:另一种方法是将您想要的 AI 传递到父类(super class)的构造函数和 r() 中,如果它为 null,则执行基类的功能,否则分配新的 AI 。接口(interface)将是一种使 AI 对象多态化的便捷方法。

关于java - 在通过 super() 调用实例化对象后,如何将变量传递到对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47581281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com