子类覆盖父类变量?

时间:2013-01-06 13:07:53

标签: c# inheritance xna

我有一个“单元”类,它包含我游戏中所有单元将共享的功能和变量。然后我用“士兵”课程扩展了它。 Unit有一个保存基本纹理的静态变量(因为它在创建时对于该类型的所有单位都是相同的,纹理可能随时间而变化)。这些是通过以下方式加载的:

Unit.baseTexture = content.Load<Texture2D>("worker");
Soldier.baseTexture = content.Load<Texture2D>("soldier");

当从“单元”构造函数创建“单元”时,它将使用:

加载纹理
this.texture = Unit.baseTexture;

当创建“士兵”时,它将加载它:

this.texture = Soldier.baseTexture;

texture是一个受保护的变量,而不是静态的,因此它应该是每个对象一个。

在主游戏逻辑中,我有一个ArrayList,其中存储了多个Unit和Soldier对象。

当我遍历它们时,我正在做:

foreach (Unit unit in unitList)
{
    unit.Draw(spriteBatch);
}

Draw是Unit类的一个函数:

spriteBatch.Draw(this.texture, this.position, Color.White);

但是,这会导致所有单位使用最后加载的纹理绘制(在本例中为士兵纹理)。这让我感到困惑,因为我首先调用了父类,然后是子类。为什么加载士兵纹理也改变了单位纹理,如果绘制的是每个对象的纹理?

2 个答案:

答案 0 :(得分:1)

我认为在这里做的正确的事情是使用BaseTexture的属性,然后您可以使用override关键字根据需要覆盖它。应避免使用new关键字隐藏成员。

例如:

class Unit
{
   private static Texture2D s_unitTexture = content.Load<Texture2D>("worker");
   protected virtual Texture2D BaseTexture
   {
      get { return s_unitTexture; }
   }

   public Texture2D Texture { get; set; }

   public Unit()
   {
       this.Texture = BaseTexture;
   }

   ...
}

class Soldier : Unit
{
   private static Texture2D s_soldierTexture = content.Load<Texture2D>("soldier");
   protected override Texture2D BaseTexture
   {
      get { return s_soldierTexture; }
   }

   ...
}

这样,当构造函数运行时,将使用每种类型单元的右BaseTexture。

答案 1 :(得分:0)

哦,伙计,我是个白痴。我一发布就解决了这个问题。

子类Soldier没有定义自己的baseTexture变量,因此当我使用Soldier.baseTexture加载士兵纹理时,它实际上是使用Unit.baseTexture。

我应该使用接口而不是基类吗?要确保我的所有类都有正确的加载函数和变量?否则,在制作我的子对象时,我必须继续使用“new”来强制它覆盖静态变量。