gpt4 book ai didi

java - 在 Java 中查找属于给定类型的所有子对象

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:00 24 4
gpt4 key购买 nike

我目前正在编写一个基于网格的益智游戏,但遇到了一个问题。

我有一个抽象的 Sprite 类,其中每个 Sprite 代表我的 map 上的某个对象(玩家、墙等)。这个 Sprite 类有 child (Item、Entity、Obstacle),这些 child 有 child (Item 有 InventoryItem 和 InstantUseItem),等等。只有没有其他子对象的子对象不是抽象的,因此您只能实例化您可以在游戏中找到的具体对象(您可以实例化 Sword 和 Arrow,但不能实例化 Weapon - 它们的父对象)。

我的问题是我将 Tiles 上的所有对象(每个 map 都有宽度*高度的 Tiles)存储在 Sprite ArrayList 中,现在我想做一些事情,比如找到 Player 对象所在的 Tile,或者找到所有包含 Enemy 对象(或从它们继承的类)的 Tile。

问题是,据我所知,我不能在我的 Map 或 Tile 对象中做类似的事情:

public ArrayList<t> findAllSpritesOfType(Type t) {
ArrayList<t> sprites = new ArrayList<t>();
for(Sprite s : this.getSprites()) {
if(s instanceof t) {
sprites.add((t) s); //Add after casting to right class
}
}
return sprites;
}

即使我尝试在 Sprite 中实现一个静态函数,我也需要这个(Sprite 的所有子项之间的一种“自动协方差”):

public static ArrayList<this.Type> getSpritesOnTile(Tile t) {
ArrayList<this.Type> sprites = new ArrayList<this.Type>();
for(Sprite s : t.getSprites()) {
if(s instanceof this.Type) {
sprites.add((this.Type) s); //Add after casting to right class
}
}
return sprites;
}

我想到的其他方法包括:

  1. 使后一种方法返回一个 Sprites 数组,然后在所有子项中覆盖此方法以使用协方差返回一个子项数组。
  2. 让 Sprite 包含 isWeapon()、isItem()、isEntity() 等(它们都返回 false),然后在适当的子项中覆盖这些方法。我现在使用这些方法而不是统一的 isGivenType(Type t) 方法或统一的静态 Type.isGivenType() 方法。

确保我的程序符合面向对象的原则,并且易于扩展,这对这个项目来说非常重要。有什么方法可以实现我的任何解决方案或实现我的目标吗?

最佳答案

看起来这就是你想要的:

public <T extends Sprite> ArrayList<T> findAllSpritesOfType(Class<T> clazz) {
ArrayList<T> sprites = new ArrayList<>();
for(Sprite s : this.getSprites()) {
if(clazz.isInstance(s)) {
sprites.add((T) s);
}
}
return sprites;
}

然后你可以像这样使用它:

List<Item> items = findAllSpritesOfType(Item.class);

另一种方法是返回流而不是列表:

public <T extends Sprite> Stream<T> findAllSpritesOfType(Class<T> clazz) {
return getSprites().stream().filter(clazz::isInstance).map(clazz::cast);
}

关于java - 在 Java 中查找属于给定类型的所有子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52362297/

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