0

コードで部屋 (部屋マップ: 文字列の 2 次元配列、行数、列数) を表現したいと考えています。4 つの回転 (90、180、270、0 度) にアクセスする必要があります。すべてのフィールド: マップ、行、列は、部屋を回転させると変更されます。IRoom90私は 4 つのインターフェイスを宣言することを考えていIRoom180ました...そしてそれらすべてを実装しますが、それから私は書かなければ((IRoom90) myRoom).columns ならず、これはエレガントではないようです。

そのような機能を実装する適切な方法は何ですか?

EDIT:私はのようなアクセスを与える何かを考えていましたmyRoom.rot(90).columns.

4

2 に答える 2

0

Ok。だから私はこれを思いつきます:

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

それを改善する方法についての提案を喜んでお聞きします。

于 2015-12-03T14:41:32.867 に答える
0

ローテーションを実行するためのデータの 1 つのコピーと 1 つのパブリック メソッド。冗長なデータは悪い考えです。回転量に基づいて動作する 1 セットの計算だけが必要です。説明した 4 つのローテーションに対して 4 つのパブリック メソッドを記述することも、パラメーターを受け取るパブリック メソッドを 1 つだけ記述することもできます。

4 つのローテーションの列挙型データ型を作成し、そのインスタンスをローテーション メソッドに渡すこともできます。これにより、メソッドでの引数の検証が不要になります。

于 2015-12-03T11:45:38.627 に答える