2015-12-03 75 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); 
     } 

我會很樂意聽到任何建議如何改善它。

相關問題