2015-12-03 4 views
0

Я хочу представить комнату (карту комнаты: 2d массив строк, количество строк, nr. Столбцов) в моем коде. Мне нужно получить четыре оборота (90, 180, 270, 0 градусов). Все поля: карта, строки строк изменяются при повороте комнаты. Я думал об объявлении четырех интерфейсов IRoom90, IRoom180 ... и реализации их всех, но тогда мне нужно написать ((IRoom90) myRoom).columns, и это кажется не изящным.Оптимальный способ представления нескольких версий одних и тех же данных

Каков надлежащий способ реализации таких функций?

EDIT: Я думал о том, что даст мне доступ, как myRoom.rot(90).columns.

ответ

0

Один экземпляр данных и один общедоступный метод для выполнения поворотов. Избыточные данные будут плохой идеей. Вам нужен только один набор вычислений, которые работают в зависимости от количества вращения. Вы можете написать 4 общедоступных метода для описанных 4 поворотов или только один общедоступный метод, который принимает параметр.

Вы также можете создать нумерованный тип данных для 4-х поворотов и потребовать экземпляр, который должен быть передан методу вращения. Это позволит исключить проверку аргумента в методе.

+0

См. Редактирование на op. В любом случае, я не получаю ваш второй абзац. Не могли бы вы перефразировать? – 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); 
     } 

Я буду рад услышать любые предложения по его улучшению.

 Смежные вопросы

  • Нет связанных вопросов^_^