C#子类最佳实践

5
我目前正在使用XNA开发游戏,不确定该如何进行以下操作...
我有一个建筑基类,如下所示:
   public class BuildingsBase
   {
     private int _hp;
     public int hp
     {
        get { return _hp; }
        set { _hp= value; }
     }

     private int _woodRequired;
     public int woodRequired
     {
        get { return _woodRequired; }
        set { _woodRequired = value; }
     }
  }

我有多个子类来构建不同类型的建筑物,例如。
public class TownHall:BuildingsBase
{
    public int foodHeld;

    public TownHall()
    {
        foodHeld = 100;
        woodRequired = 500;
    }
}

我的问题是,为创建子类设置默认值的最佳方法是什么。
例如,城镇大厅的木材需求设置为500,但在代码的各个位置上,我需要在声明城镇大厅实例之前访问此值(当检查是否有足够的木材来建造时)。
我目前拥有每种建筑类型的全局默认变量数组,但我想知道是否有更好的方法来做到这一点。
if (Globals.buildingDefaults[BuildingType.Townhall].woodRequired < Globals.currentWood)
{
    Townhall newTH = new Townhall();
}

1
为什么不换个思路呢?首先构建例如TownHall内部,然后检查woodRequired <= myCurrentWood的值,如果没有足够的木材可用,就将对象销毁。当然,如果你有大量计算的巨型对象,就不应该这样做。用户不知道你已经持有对象,只是调用.Show()或其他操作。 - Nitro.de
第二个想法是实现一个 int currentWood() 函数,并在对象的构造函数中进行检查,如果木材不足,则可以停止创建。 - Nitro.de
在我看来,具有 get {} 的属性应该可以解决这个问题。 - Mihail Georgescu
1个回答

4
通常情况下,他们会创建一个享元对象(请参见模式)。该对象包含的属性在每个实例中都是相同的。没有必要单独更改(或实际存储)每个实例所需的木材数量。
在非常基本的设计中,它看起来像这样:
class BuildingTemplate
{
     public int WoodRequired { get; set; }
}

class Templates
{
    public static BuildingTemplate TownHall { get; set; }
}

最终你需要调用一个类似这样的方法: ```python 调用方法名() ```
public bool CanBuildTownHall(Player player)
{
    return player.HasEnoughResources(Templates.TownHall);
}

当然,您可以使用字典来检索模板,玩家不需要真正了解建筑要求。我只是在这里说明模式。
如果玩家有足够的资源,您可以使用模板来减去数量并创建TownHall的实际实例。拥有对实际模板的引用很好,因为您可能还将访问其他全局属性,这些属性对所有TownHall都有效(例如音频/视觉/...)。
class TownHall
{
    public TownHall(BuildingTemplate template)
    {
        _template = template;
    }
}

非常感谢,非常有帮助,这似乎是一种类似于全局数组但开销更小的方法。 - user3208483

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接