我正在處理一個問題,並遇到了一個問題,我有多個體繫結構選項,但我不確定哪個將成爲最佳選項。用於引用公共屬性的靜態實例和枚舉
上下文: 我正在寫一些遊戲的代碼,它使用了一個貼圖。瓷磚具有共同的屬性,例如,所有的地磚都可以步行,而牆壁不是(以及其他屬性)。因此,有一定的參考意義,每個瓦片可以指向一個共同的參考來辨別其特性。
我已經想出了一些解決方案,但是我不確定哪個是最有效的或者將提供最大的靈活性。因此,我很好奇哪些被認爲是「最好的」,無論是一般的還是我的具體情況。同樣,如果有更好的方法可以做到這一點,我還沒有列出,請讓我知道。 (另外,隨着tile類型數量的增加,我可能會遇到這樣的問題:對這些值進行硬編碼可能不太實際,某種類型的序列化或文件I/O可能更有意義。正如我在C#中所做的一樣,如果你在這裏看到任何潛在的絆腳石,如果你可以將它們包含在你的答案中,將會同樣讚賞。)
下面是我的三種方法,我略微簡化了使他們更普遍的:
方法1:枚舉與擴展方法:
public enum TileData{
WALL,
FLOOR,
FARMLAND
//...etc
}
public static class TileDataExtensions{
public static int IsWalkable(this TileData tile){
switch(tile){
case TileData.FLOOR:
case TileData.FARMLAND:
return true;
case TileData.WALL:
return false;
}
}
public static int IsBuildable(this TileData tile){
switch(tile){
case TileData.FLOOR:
return true;
case TileData.WALL:
case TileData.FARMLAND:
return false;
}
}
public static Zone ZoneType(this TileData tile){
switch(tile){
case TileData.WALL:
case TileData.FLOOR:
return Zone.None;
case TileData.FARMLAND:
return Zone.Arable;
}
}
public static int TileGraphicIndex(this TileData tile){
switch(tile){
case TileData.WALL:
return 0;
case TileData.FLOOR:
return 1;
case TileData.FARMLAND:
return 2;
}
}
public enum Zone{
Shipping,
Receiving,
Arable,
None
}
}
方法2:巨大的私人構造&靜態實例
public class TileData{
public bool IsWalkable{get;};
public bool IsBuildSpace{get;};
public Zone ZoneType{get;};
public int TileGraphicIndex{get;};
public static TileData FLOOR = new TileData(true, true, Zone.None, 1);
public static TileData WALL = new TileData(false, false, Zone.None, 0);
public static TileData FARMLAND = new TileData(true, false, Zone.Arable, 2);
//...etc
private TileData(bool walkable, bool buildSpace, Zone zone, int grahpicIndex){
IsWalkable = walkable;
IsBuildSpace = buildSpace;
ZoneType = zone;
TileGraphicIndex = grahpicIndex;
}
public enum Zone{
Shipping,
Receiving,
Arable,
None
}
}
方法3:私有構造函數和setter,用靜態實例:
public class TileData{
public bool IsWalkable{get; private set;};
public bool IsBuildSpace{get; private set;};
public Zone ZoneType{get; private set;};
public int TileGraphicIndex{get; private set;};
public static TileData FLOOR{
get{
TileData t = new TileData();
t.IsBuildSpace = true;
t.TileGraphicIndex = 1;
return t;
}
}
public static TileData WALL{
get{
TileData t = new TileData();
t.IsWalkable = false;
return t;
}
}
public static TileData FARMLAND{
get{
TileData t = new TileData();
t.ZoneType = Zone.Arable;
t.TileGraphicIndex = 2;
return t;
}
}
//...etc
//Constructor applies the most common values
private TileData(){
IsWalkable = true;
IsBuildSpace = false;
ZoneType = Zone.None;
TileGraphicIndex = 0;
}
public enum Zone{
Shipping,
Receiving,
Arable,
None
}
}
非常感謝,LR92
編輯:瓷磚的類型由設計者在編譯之前確定,即不應該允許任何類創建新的TileData類型(即,在示例中,實例2)。
多少瓦的類型,你預計有(量級)? –
**關於方法3的附加子問題:**每次調用方法3都會重新創建一個方法(因此效率較低,然後說方法2),還是在編譯時/第一次調用時單獨解決? – LeftRight92
@JerryFederspiel少於100個,最多約50個 – LeftRight92