【问题标题】:Child class overwriting parent class variable?子类覆盖父类变量?
【发布时间】:2013-01-06 13:07:53
【问题描述】:

我有一个“单元”类,它包含我游戏中所有单元将共享的函数和变量。然后我用“士兵”类扩展了它。单元有一个静态变量来保存基础纹理(因为创建时该类型的所有单元都是相同的,纹理可能会随着时间而改变)。这些是由以下人员加载的:

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

当从“Unit”构造函数创建“Unit”时,它将加载纹理:

this.texture = Unit.baseTexture;

当一个“士兵”被创建时,它会像这样加载它:

this.texture = Soldier.baseTexture;

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

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

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

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

Draw 是 Unit 类的一个函数:

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

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

【问题讨论】:

    标签: c# inheritance xna


    【解决方案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; }
       }
    
       ...
    }
    

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

    【讨论】:

    • 您能详细说明一下吗?我是 csharp 的新手,之前没有听说过属性这个词。
    【解决方案2】:

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

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

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

    【讨论】:

    • 归咎于缺乏咖啡。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多