我正在尝试制作一个类别系统。我的尝试是使用枚举枚举。我有一个名为Tile
的班级。我的Tile
课程也有Type type;
个变量。
当我尝试声明type = Type.Wall.BOTTOM;
(或type = Type.Floor.CROOKED;
)时,它声明所需的类型为Type
,但找到的类型为Wall
(或Floor
)。
具体来说,我试图在游戏中对Tiles进行分类。有些瓷砖是墙壁,有些是地板。墙可以是x,y,x
,地板可以是1,2,3
。因此tile
可以是wall.x
或floor.1
。从这里,我可以知道确切的类型(我的意思是包括子类型,以便我可以在屏幕上绘制正确的图块纹理),有时我只需要知道类型,以便我知道瓷砖是否可以步行或不。
这就是我所做的:
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
}
}
我如何设计这个适用于我的情况?
答案 0 :(得分:1)
让我们谈谈你的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();
}
}
答案 1 :(得分:1)
忽略枚举类型的枚举,并仅为此要求应用基本的OOAD技术:
我正在尝试在游戏中对Tiles进行分类。有些瓷砖是墙 有些是地板。墙可以是x,y,x,地板可以是1,2,3。瓦可以 是wall.x或floor.1。由此,我可以知道确切的类型(我通过它 意味着包括子类型,以便我可以绘制正确的瓷砖 屏幕上的纹理)有时候我只需要知道这种类型 我知道瓷砖是否可以步行。
abstract class Tile {
abstract boolean isWalkable();
}
class Wall extends Tile {
public enum WallPosition {
TOP_LEFT, TOP, TOP_RIGHT, LEFT, RIGHT, BOTTOM_LEFT,
BOTTOM, BOTTOM_RIGHT, NORTH_EAST, NORTH_WEST, SOUTH_EAST,
SOUTH_WEST
}
@Override boolean isWalkable() {
return false;
}
}
class Floor extends Tile {
public enum FloorType {
CROOKED, WOOD
}
@Override boolean isWalkable() {
return true;
}
}
我假设您可能对Wall
和Tile
都有共同状态 - 使用抽象类的原因。否则它只能是一个界面。
答案 2 :(得分:0)
好吧,我仍然怀疑我是否正确理解了这个问题,但是如果你愿意使用instanceof
来检查类型,那么他是否愿意执行演员来获得子类型信息,然后您可以使用由不同枚举共享的接口执行此操作。
public interface Type {
}
public enum Wall implements Type {
TOP_LEFT, TOP, TOP_RIGHT,
LEFT, RIGHT,
BOTTOM_LEFT, BOTTOM, BOTTOM_RIGHT,
NORTH_EAST, NORTH_WEST,
SOUTH_EAST, SOUTH_WEST
}
public enum Floor implements Type {
TOP_LEFT,
TOP
}
然后,您可以编写如下代码:
public static void main(String[] args) {
Type t = Wall.BOTTOM;
System.out.println(t instanceof Wall);
System.out.println(((Wall)t) == Wall.BOTTOM);
t = Floor.TOP_LEFT;
System.out.println(t instanceof Floor);
System.out.println(((Floor)t) == Floor.TOP_LEFT);
}