如何获取静态对象属性的类

时间:2021-05-08 04:43:09

标签: java object abstract

我有一个父类 Tile 和继承类 Walltile、FloorTile、EntityTile。每个继承的类都有与其名称相关的 BufferedImage 属性。

public class WallTile extends Tile {

public static BufferedImage WATER_TOP_LEFT = Game.tilesSpritesheet.getSprite(34, 0);
public static BufferedImage WATER_TOP = Game.tilesSpritesheet.getSprite(51, 0);
public static BufferedImage WATER_TOP_RIGHT = Game.tilesSpritesheet.getSprite(68, 0);
public static BufferedImage WATER_LEFT = Game.tilesSpritesheet.getSprite(34, 17);
public static BufferedImage WATER_CENTER = Game.tilesSpritesheet.getSprite(51, 17);
public static BufferedImage WATER_RIGHT = Game.tilesSpritesheet.getSprite(68, 17);
public static BufferedImage WATER_BOTTOM_LEFT = Game.tilesSpritesheet.getSprite(34, 34);
public static BufferedImage WATER_BOTTOM = Game.tilesSpritesheet.getSprite(51, 34);
public static BufferedImage WATER_BOTTOM_RIGHT = Game.tilesSpritesheet.getSprite(68, 34);
public static BufferedImage WATER_LITTLE_TOP_LEFT = Game.tilesSpritesheet.getSprite(17, 34);

public WallTile(BufferedImage sprite, int x, int y) {
    super(sprite, x, y);
}
}

public class FloorTile extends Tile {

public static BufferedImage TILE_GRASS = Game.tilesSpritesheet.getSprite(85, 0);
public static BufferedImage TILE_SAND = Game.tilesSpritesheet.getSprite(136, 0);

public FloorTile(BufferedImage sprite, int x, int y) {
    super(sprite, x, y);
}
}

public class EntityTile extends Tile {

public static BufferedImage TILE_TREE_1 = Game.tilesSpritesheet.getSprite(221, 153);
public static BufferedImage TILE_TALL_GRASS = Game.tilesSpritesheet.getSprite(374, 187);

public static List<BufferedImage> spriteList = new ArrayList<BufferedImage>();

// Construtor
public EntityTile(BufferedImage sprite, int x, int y) {
    super(sprite, x, y);
}

@Override
public void render(Graphics g) {
    g.drawImage(FloorTile.TILE_GRASS, x - Camera.x, y - Camera.y, null);
    g.drawImage(sprite, x - Camera.x, y - Camera.y, null);
}
}

我实例化 Tile 然后我转换到特定的类,例如:

Tile tile = new Tile(sprite, 0, 0);
WallTile wt = (WallTile) tile;

但我需要知道这个 Tile 对象是 WallTile、FloorTile 还是 EntityTile。为此,我有对应于我想要的 ****Tile 类的 sprite 属性。我怎样才能得到这些信息?当我使用 sprite.getClass() 时,它返回 BufferedImage,但我需要像 WallTile、FloorTile 或 EntityTile 一样返回。 为此:

if (tile.sprite.getClass().toString() == "class World.WallTile")
    //do something

1 个答案:

答案 0 :(得分:0)

这行代码不会创建一个 WallTile 对象。

Tile tile = new Tile(sprite, 0, 0);

以上行创建了一个 Tile 对象,因此无法转换为 WallTile

我在您的问题中找不到类 Tile 的代码,但我想您应该将其设为抽象类并授予构造函数 protected 访问权限,以避免直接构造 {{1} }} 对象。

考虑类 Tile 及其子类 Furniture。我可以创建 Table 但我不能创建 Table 因为 Furniture 是一个通用术语。它的目的是存储所有类型家具的共同属性。

同样,您的 Furniture 类是一个基类,它只存储 TileWallTileFloorTile 共有的属性。

以下代码行将创建一个 EntityTile 作为 WallTile 对象,因此可以进行转换。

Tile

Tile tile = new WallTile(sprite, 0, 0); // 'tile' is actually 'WallTile' instance WallTile wallTile = (WallTile) tile; sprite 属性是一个 Tile,无论它属于哪种类型的对象。所以BufferedImageclass总是sprite。您可以做的是检查 BufferedImage 实际上是什么,因为 sprite 的所有可能值都必须是您定义的常量之一。

因此,例如,为了确定 sprite 对象是否实际上是 Tile,您可以执行以下操作:

WallTile

不过,我想知道您为什么需要这样做。您没有发布 minimal, reproducible example,因此缺少上下文。我不知道您如何获得 if (sprite == WallTile.WATER_TOP_LEFT || sprite == WallTile.WATER_TOP || // etc) { } 对象以及为什么需要确定 Tile 的实际类型。尽管如此,您不能简单地执行以下操作吗?

Tile
相关问题