2015-12-03 43 views
0

我想在代码中表示一个房间(房间地图:字符串的二维数组,行数,列数)。我需要访问它的四个旋转(90,180,270,0度)。所有字段:地图,旋转房间时行列都会更改。 我正在考虑宣布四个接口IRoom90,IRoom180 ......并且实现它们,但是之后我必须编写((IRoom90) myRoom).columns,这看起来不够优雅。代表同一数据的多个版本的最佳方式

什么是实现这种功能的正确方法?

编辑:我正在考虑那会给我像myRoom.rot(90).columns访问。

回答

0

执行旋转的数据和公共方法的一个副本。冗余数据将是一个坏主意。您只需要一组基于旋转量操作的计算。你可以为你描述的4次旋转写4个公共方法,或者只需要一个采用参数的公共方法。

您也可以为4次旋转创建枚举数据类型,并要求将其实例传递给旋转方法。这将消除该方法中的参数验证。

+0

请参阅编辑操作。无论如何,我不明白你的第二段。你能改说吗? – hungry91

0

好的。所以我想出了这个:

public class Room 
    { 
     public class OrientedRoom{ 
      Direction dir; 
      Room disoriented; 
      OrientedRoom(Direction dir, Room disoriented){ 
       this.dir = dir; 
       this.disoriented = disoriented; 
      } 
      public int Cols{ 
       get{ 
        if(dir==Direction.North || dir == Direction.South) 
         return disoriented.cols; 
        else 
         return disoriented.rows; 
       } 
      } 
      public int Rows{ 
       get{ 
        if(dir==Direction.North || dir == Direction.South) 
         return disoriented.rows; 
        else 
         return disoriented.rows; 
       } 
      } 
      public string this[int i, int j]{ 
       get{ 
        switch(dir){ 
        case Direction.West: return disoriented.map[Cols-j-1, i];break; 
        case Direction.South:return disoriented.map[Rows-i-1, Cols-j-1];break; 
        case Direction.East: return disoriented.map[j,Rows-i-1]; break; 
        case Direction.North:return disoriented.map[i, j];break; 
        } 
       } 
      } 
     } 
     public readonly int cols; 
     public readonly int rows; 
     private string[,] map; 
     public int score; 
     public string name; 

     public enum Direction{North, South, East, West}; 
     public OrientedRoom rot(Direction dir){ 
      return new OrientedRoom (dir, this); 
     } 

我会很乐意听到任何建议如何改善它。

相关问题