繁体   English   中英

C#Subclass最佳实践

[英]C# Subclass Best Practice

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

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

例如,市政厅的woodRequired被设置为500但在代码中的不同位置我需要在我宣布市政厅的实例之前访问该值(当检查是否有足够的木材建造时)。

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

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

通常情况下,他们会创建一个flyweight( 参见模式 )。 此对象包含对每个实例都相同的属性。 没有必要单独更改(或实际存储)每个实例所需的木材数量。

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

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也有效的其他全局属性(例如audio / TownHall / ...)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM