子类覆盖父类变量

本文关键字:类变量 父类 覆盖 子类 | 更新日期: 2023-09-27 17:50:57

我有一个类"Unit",它包含游戏中所有单元共享的函数和变量。然后我用"Soldier"类扩展了它。单位有一个静态变量保存基本纹理(因为创建时该类型的所有单位都是相同的,纹理可能会随着时间而变化)。这些是通过:

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

当从"Unit"构造器创建"Unit"时,它将加载纹理:

this.texture = Unit.baseTexture;

当一个"Soldier"被创建时,它将像这样加载它:

this.texture = Soldier.baseTexture;

texture是一个受保护的变量,不是静态的,所以每个对象应该有一个。

在主游戏逻辑中,我有一个数组列表,其中存储有多个Unit和Soldier对象。

当我循环遍历它们时,我在做:

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

Draw是Unit类上的函数:

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

然而,这会导致所有单位使用最后加载的纹理绘制(在这种情况下,是士兵纹理)。这让我很困惑,因为我先调用父类,然后调用子类。如果绘制的是每个对象的纹理,为什么加载士兵纹理也会改变单位纹理?

子类覆盖父类变量

我认为这里要做的正确的事情是使用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; }
   }
   ...
}

这样,当构造函数运行时,将为每种类型的Unit使用正确的BaseTexture。

天哪,我真是个白痴。我一发帖就解决了这个问题。

子类Soldier没有定义自己的baseTexture变量,所以当我用Soldier加载Soldier纹理时。baseTexture,它实际上使用的是unit。baseTexture

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