我想在代碼中表示一個房間(房間地圖:字符串的二維數組,行數,列數)。我需要訪問它的四個旋轉(90,180,270,0度)。所有字段:地圖,旋轉房間時行列都會更改。 我正在考慮宣佈四個接口IRoom90
,IRoom180
......並且實現它們,但是之後我必須編寫((IRoom90) myRoom).columns
,這看起來不夠優雅。代表同一數據的多個版本的最佳方式
什麼是實現這種功能的正確方法?
編輯:我正在考慮那會給我像myRoom.rot(90).columns
訪問。
我想在代碼中表示一個房間(房間地圖:字符串的二維數組,行數,列數)。我需要訪問它的四個旋轉(90,180,270,0度)。所有字段:地圖,旋轉房間時行列都會更改。 我正在考慮宣佈四個接口IRoom90
,IRoom180
......並且實現它們,但是之後我必須編寫((IRoom90) myRoom).columns
,這看起來不夠優雅。代表同一數據的多個版本的最佳方式
什麼是實現這種功能的正確方法?
編輯:我正在考慮那會給我像myRoom.rot(90).columns
訪問。
執行旋轉的數據和公共方法的一個副本。冗餘數據將是一個壞主意。您只需要一組基於旋轉量操作的計算。你可以爲你描述的4次旋轉寫4個公共方法,或者只需要一個採用參數的公共方法。
您也可以爲4次旋轉創建枚舉數據類型,並要求將其實例傳遞給旋轉方法。這將消除該方法中的參數驗證。
好的。所以我想出了這個:
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);
}
我會很樂意聽到任何建議如何改善它。
請參閱編輯操作。無論如何,我不明白你的第二段。你能改說嗎? – hungry91