C# 子类最佳实践

标签 c# constructor subclass

我目前正在使用 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;
    }
}

我的问题是,为构建子类设置默认值的最佳方法是什么。

例如,townhall 的 woodRequired 设置为 500,但在代码的不同位置,我需要在声明 townhall 实例之前访问此值(检查是否有足够的木材来 build 时)。

我目前有一个针对每种建筑类型的默认变量的全局数组,但我想知道是否有更好的方法来做到这一点。

if (Globals.buildingDefaults[BuildingType.Townhall].woodRequired < Globals.currentWood)
{
    Townhall newTH = new Townhall();
}

最佳答案

通常情况下,他们会创建享元 (see pattern)。该对象包含的属性对于每个实例都是相同的。无需单独更改(或实际存储)每个实例所需的木材量。

在一个非常基本的设计中,它看起来像:

class BuildingTemplate
{
     public int WoodRequired { get; set; }
}

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

最后你会调用这样的方法:

public bool CanBuildTownHall(Player player)
{
    return player.HasEnoughResources(Templates.TownHall);
}

模板检索当然可以用字典,玩家应该不太了解搭建要求。我只是在这里说明模式。

如果玩家有足够的资源,您可以使用模板减去数量并创建TownHall 的实际实例。有对实际模板的引用是很好的,因为您可能正在访问对所有 TownHall 都有效的其他全局属性(例如音频/视频/...)。

class TownHall
{
    public TownHall(BuildingTemplate template)
    {
        _template = template;
    }
}

关于C# 子类最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36083120/

相关文章:

c# - Fiddler 未从我的 C# 应用程序捕获流量

c++ - 在结构中定义构造函数

python - Python 中的文本冒险 : Working with Classes and Inheritance

python - 向父类中的函数添加条件更好,还是为每个子类定义单独的函数更好?

c# - 当两个方法在替换类型参数后具有相同的签名时,错误的重载将被覆盖

c# - C# 的 Marshal.ReadInt32(IntPtr) 在 Delphi 中是什么意思?

c# - 将用户控件拖放到 VS 设计器时发生 TypeLoadException

javascript - 无法真正理解 Javascript 中的构造函数和原型(prototype)关系

c++ - 在构造函数中初始化数组或 vector

java - 从一个类到外部类的指针?