2013-01-06 116 views
1

我有一個類「單位」,它擁有我遊戲中所有單位共享的函數和變量。然後我用一個「士兵」班擴展它。單位有一個靜態變量,用於保存基本紋理(因爲創建時該類型的所有單位都是相同的,紋理可能隨時間而改變)。子類覆蓋父類變量?

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

當從「單元」構造函數創建一個「單元」,它會加載與所述紋理:這是由加載在創建「士兵」

this.texture = Unit.baseTexture; 

,它將加載它是這樣的:

this.texture = Soldier.baseTexture; 

紋理是一個受保護的變量,而不是靜態的,所以它應該是每個對象一個。

在主要的遊戲邏輯中,我有一個ArrayList,它有多個Unit和Soldier對象存儲在其中。

當我通過他們循環,我做的:

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

平局是在股類中的函數:

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

然而,這導致所有單位最後加載的畫紋理(在這種情況下,士兵紋理)。這讓我感到困惑,因爲我先調用父類,然後調用子類。爲什麼加載Soldier紋理也改變了Unit紋理,如果繪製的是每個對象的紋理?

回答

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將被使用。

+0

你能詳細說明一下嗎?我是csharp的新手,沒有聽說過術語屬性。 – MatthewMcGovern

+0

添加了一個示例。 – JLRishe

+0

啊,非常感謝你。這很有道理! – MatthewMcGovern

0

哦,我是個白癡。我一發布就解決了這個問題。

子類Soldier沒有定義自己的baseTexture變量,所以當我用Soldier.baseTexture加載士兵紋理時,實際上是使用Unit.baseTexture。

我應該使用接口而不是基類嗎?爲了確保我所有的類都有正確的加載函數和變量?否則,當使我的子對象強制重寫一個靜態變量時,我必須繼續使用「新」。

+3

責備它缺乏咖啡。 ;) – OnoSendai

+0

jsut然後刪除。 – Nahum