我正在解决一个问题,遇到了一个困难:我有多种架构选项,但不确定哪个是未来最佳选择。上下文:我正在为游戏编写代码,游戏使用瓷砖地图。瓷砖具有共同属性,例如,所有地板瓷砖都可以行走,而墙壁则不能(还有其他属性)。因此,让每个瓷砖指向一个共同的引用以区分其属性是有意义的。我想出了几个解决方案,但不确定哪个效率最高或提供的灵活性最大,因此我很好奇哪个会被认为是“最佳”的,无论是一般情况还是我的特定情况。同样,如果有更好的方法没有列出,请告诉我。另外,随着瓷砖类型数量的增加,可能实际上不适合硬编码这些值,并且某种序列化或文件 I/O 可能更有意义。由于我在 C# 中都没有做过,如果您看到任何潜在障碍,也请在回答中包括它们。以下是我的三种方法,我稍微简化了它们使它们更普遍:
方法一:使用扩展方法的枚举:
非常感谢,LR92。
编辑:瓷砖的类型在设计时确定,即不应允许任何类创建新的TileData类型(例如,在示例2和3中,实例)。
方法一:使用扩展方法的枚举:
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
}
}
方法二:使用巨大的私有构造函数和静态实例
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
}
}
方法三: 私有构造函数和设置器, 静态实例:
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中,实例)。
private static TileData _farmLand
,在 getter 中写上return _farmLand ?? _farmLand = new TileData() { property stuff };
。这将返回 _farmLand(如果不为 null),否则它将调用 TileData 构造函数,初始化属性,将其分配给 _farmLand,并返回它。 - Jerry Federspielnew TileData()
。 - vendettamit