子类覆盖父类变量
本文关键字:类变量 父类 覆盖 子类 | 更新日期: 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"来强制它覆盖静态变量。