首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#子类最佳实践

C#子类最佳实践
EN

Stack Overflow用户
提问于 2016-03-18 11:23:38
回答 1查看 2.5K关注 0票数 5

我目前正在XNA做一个游戏,我不知道该如何做以下的事情.

我有这样的建筑的基类

代码语言:javascript
复制
   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; }
     }
  }

然后,我有多个用于构建类型的子类,例如。

代码语言:javascript
复制
public class TownHall:BuildingsBase
{
    public int foodHeld;

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

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

例如,市政厅的woodRequired设置为500,但在代码中的不同地方,我需要在声明乡镇大厅实例之前访问这个值(当检查是否有足够的木料进行构建时)。

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

代码语言:javascript
复制
if (Globals.buildingDefaults[BuildingType.Townhall].woodRequired < Globals.currentWood)
{
    Townhall newTH = new Townhall();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-18 11:32:40

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

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

代码语言:javascript
复制
class BuildingTemplate
{
     public int WoodRequired { get; set; }
}

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

最后,您将调用这样的方法:

代码语言:javascript
复制
public bool CanBuildTownHall(Player player)
{
    return player.HasEnoughResources(Templates.TownHall);
}

当然,您可以使用字典进行模板检索,玩家不应该真正了解构建需求。我只是想说明一下这个模式。

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

代码语言:javascript
复制
class TownHall
{
    public TownHall(BuildingTemplate template)
    {
        _template = template;
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36083120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档