如何创建嵌套类别系统?

时间:2015-08-11 18:18:53

标签: java enums

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

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

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

我如何设计这个适用于我的情况?

3 个答案:

答案 0 :(得分:1)

让我们谈谈你的Tile课程将要做什么。

  1. 它将以某种方式与Wall进行互动,并以完全不同的方式与Floor进行互动
  2. 无论WallFloor如何,它都会做其他任何事情。
  3. 因此,正确的做法是完全封闭该行为远离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;
    }
}

我假设您可能对WallTile都有共同状态 - 使用抽象类的原因。否则它只能是一个界面。

答案 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);
}