java - 如何制作嵌套类别系统?

标签 java enums

我正在尝试制作一个类别系统。我的尝试是使用枚举的枚举。我有一个名为Tile 的类。我的 Tile 类还有一个 Type type; 变量。

当我尝试声明 type = Type.Wall.BOTTOM; (或 type = Type.Floor.CROOKED;)时,它指出所需的类型为 类型,但找到的类型是墙壁(或地板)。

具体来说,我正在尝试对游戏中的图 block 进行分类。有些瓷砖是墙壁,有些是地板。墙可以是x,y,x,地板可以是1,2,3。因此,tile 可以是 wall.xfloor.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 类将要做什么。

  1. 它将以一种方式与Wall交互,并以完全不同的方式与Floor交互
  2. 无论WallFloor如何,它都会做它会做的任何其他事情。

因此,正确的做法是将该行为完全封装,使其远离 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/

相关文章:

java - 对于从下拉框中选择的特定值,在下拉列表中显示其对应的值吗?

java - 无法使用 Intent.ACTION_VIEW 在 Android 上打开 excel 文件

java - 如何使用 displaytag 传递隐藏变量

java - Android TextView 和 ImageView 的布局问题

javascript - 如何在React中通过数字键从枚举中获取值

java - 内部枚举或类是否有效?

java - 难以理解合并排序算法的合并部分

c - 如何在 C 语言中使用引用调用发送枚举数据类型

c# - Entity Framework 5 枚举命名

c++ - 结构中的枚举