我正在尝试制作一个类别系统。我的尝试是使用枚举的枚举。我有一个名为Tile
的类。我的 Tile
类还有一个 Type type;
变量。
当我尝试声明 type = Type.Wall.BOTTOM;
(或 type = Type.Floor.CROOKED;
)时,它指出所需的类型为 类型
,但找到的类型是墙壁
(或地板
)。
具体来说,我正在尝试对游戏中的图 block 进行分类。有些瓷砖是墙壁,有些是地板。墙可以是x,y,x
,地板可以是1,2,3
。因此,tile
可以是 wall.x
或 floor.1
。由此,我可以知道确切的类型(我的意思是包括子类型,以便我可以在屏幕上绘制正确的图 block 纹理),有时我只需要知道类型,以便我知道图 block 是否可步行或不。
这就是我所做的:
public enum Type {
;
public enum Wall {
TOP_LEFT, TOP, TOP_RIGHT,
LEFT, RIGHT,
BOTTOM_LEFT, BOTTOM, BOTTOM_RIGHT,
NORTH_EAST, NORTH_WEST,
SOUTH_EAST, SOUTH_WEST
}
public enum Floor {
CROOKED,
WOOD
}
}
我如何设计它以适合我的案例?
最佳答案
让我们谈谈您的 Tile
类将要做什么。
- 它将以一种方式与
Wall
交互,并以完全不同的方式与Floor
交互 - 无论
Wall
和Floor
如何,它都会做它会做的任何其他事情。
因此,正确的做法是将该行为完全封装,使其远离 Tile
。
我将在这里使用非常蹩脚的名称,因为您没有提供用例,所以我会尽力而为。
public class Tile {
private PartOfRoom part;
public Tile(PartOfRoom part) {
this.part = part;
}
public void doSomething() {
part.doSomething();
doSomethingThatDoesntUsePart();
}
public boolean isWalkable() {
return part.isWalkable();
}
}
然后你可以拥有:
public interface PartOfRoom {
void doSomething();
}
public class FloorPartOfRoom {
private final Floor floor;
FloorPartOfRoom(Floor floor) {
this.floor = floor;
}
public void doSomething() {
floor.paint();
}
}
public class WallPartOfRoom() {
private final Wall wall;
WallPartOfRoom(Wall wall) {
this.wall = wall;
}
public void doSomething() {
wall.mop();
}
}
关于java - 如何制作嵌套类别系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31949158/