gpt4 book ai didi

java - 从集合中检索对象时向下转型

转载 作者:行者123 更新时间:2023-12-01 09:34:34 26 4
gpt4 key购买 nike

我目前正在编写一个游戏,使用基于自编写组件的实体引擎的变体。当我定义我的实体及其所具有的组件时,我想使用以下想法来正确地处理它们以供系统的其余部分使用:

class Entity {

...

用于识别不同的组件:

enum ComponentID() {
BODY,
GRAPHICS,
INVENTORY;
}
...

应容纳所有组件:

EnumMap<ComponentID, ModelComponent> components = new EnumMap<>(ComponentID.class);
}

首先,我们有一个名为 ModelComponent 的父类(super class)和一些扩展 ModelComponent 的不同具体子类,如 Body、Graphics、AI 等。

组件 EnumMap 应该保存对实体拥有的所有 ModelComponent 的引用。当我想向系统询问特定组件时,问题就出现了。例如,如果我想获取 body 组件,因为物理类想要计算一些碰撞,我会编写如下代码:

public Body getBody() {
return (Body) components.get(ComponentID.BODY);
}

需要强制转换,因为在我的游戏中的某个地方,如果我想访问实体的速度,我会调用:

Vector2 velocity = entity.getBody().getVelocity();

但是,getVelocity() 是一个仅在具体子类 Body 中定义的方法。

我的问题是:这是向下转型为子类的正确用法吗?我不知道是否可以通过更好的设计来避免向下转换,因为显然 Graphics 组件会做与 Body 组件完全不同的事情,因此它们都会有完全不同的方法。

编辑:

我忘记提及以下可能对回答此问题很重要的详细信息:

1) 当然,实体还有更具体的子类,如玩家、敌人、触发器等,它们都应该具有不同的模型组件组合。玩家不需要人工智能组件,而敌人则需要人工智能组件。

2)我这次重构的目标是摆脱字段

Body body;
Graphics graphics;
Inventory inventory;
Ai ai;

因为我的游戏中实例化的每个实体都会具有所有这些字段。enummap 可以消除这个问题,因为我将用以下代码行替换所有 getXXX() 方法:

public ModelComponent get(ComponentID id) {
return components.get(id);

}

最佳答案

简短的回答是:不。因为您要添加隐式逻辑。在这种情况下,向下转型是有效的,因为您知道它是正确的,因为在代码中您将设置正确的对象。但编译器无法检查这一点,其他开发人员也可能无法检查。因此其他人可以更改代码,编译器不会提示,只有在运行时才会抛出类转换异常。

关于java - 从集合中检索对象时向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110383/

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