2012-11-12 64 views
0

是否有可能在繼承的子類中強制靜態數據成員?C#強制子類中的靜態數據成員

這裏是我的問題/的思維過程:

我希望做一個「遊戲對象」基類的所有其他對象從借錢給多態性繼承

我希望每個繼承類有一個靜態的。 。頂點渲染的多邊形的數據成員名單的確切過程將是:

  • 創建基於對象的頂點的靜態列表上
  • 應用紋理
  • 基於實例化對象的旋轉變量
  • 旋轉對象
  • 變換基於實例化對象的世界對象的座標

爲從遊戲對象繼承的所有對象,我想保證它有靜態的頂點列表

我應該關心它是否有列表,或者我應該關心它是否具有繪製方法(由接口iRender保證)?

回答

-1

如果GameObject是一個接口,那麼你可以強制執行一個static Property的存在。

interface GameObject 
{ 
    static List<vertex> vertices {get; set;} 
    //other common code 
}; 

或者,你可以只是頂點爲GameObject本身就是一個受保護的數據成員的名單,並有派生類訪問它。

+0

我會使GameObject成爲一個接口或基類嗎?多態性是否與接口一起工作?那看起來怎麼樣? 另外,如果我把這個列表放在界面中,它不會爲每個實例化對象創建一個頂點列表嗎?我正在嘗試爲所有類似的對象實例使用1個多邊形列表,然後只爲特定實例提供單獨的轉換信息。 –

+0

GameObject將是一個接口。多態性在C#中只與*接口(最多一個類)一起工作。 –

+1

我得到「修飾符'靜態'對這個項目無效'。不編譯 – weberc2

1

憑藉繼承,基類中的protected static List<Vertex>自動成爲任何派生類的一部分。只要您不需要每個派生類都有自己的列表與任何父類中的列表分開,這應該工作。

+1

它需要分離,因爲它們是不同的遊戲對象類型(例如想象我有一個房子游戲對象,然後我有一個樹遊戲對象。他們會有不同的verticies列表,因爲它們是不同的對象)。我將有一個基類遊戲對象,所以我可以把所有的遊戲對象放到一個循環中,並說GameObject.Draw(),或者類似的東西。 –

+0

這就是繼承點 - 如果基類定義了列表,則任何派生類都將該列表作爲其定義的一部分。該列表不是「房屋」列表或「樹」列表;它是一個「對象」列表。從相同基類派生的兩個類仍然是獨立的類;即使他們共享其定義的一部分,他們也沒有任何共同的數據。 「樹」類中的列表不會與「房子」類中的列表相同。 – prprcupofcoffee

+0

沒錯,但我說的是我不想爲每個實例化對象列表。它應該是該特定繼承對象的所有實例共享的頂點的一個列表。將保護靜態列表讓我有一個不同的靜態列表爲每個子對象? –

1

在基類中爲所有後代和基類本身聲明瞭一個靜態類成員的單個實例。因此,基類中的單個頂點列表將不會執行。有什麼可以做: - 在基類中聲明

private static Dictionary<string, List<vertex>> PointsPerClass = 
    new Dictionary<string, List<vertex>>(); 

你沒有說的後代如何指定它們的頂點,但讓我們說有一個虛基類的方法,通過所有後代覆蓋:

protected virtual FillStaticVertices(List<vertex> aVertices) 
{ 
} 

然後基類有公共方法:

public GameObject CreateObject() 
{ 
    string key = GetType().FullName; 
    List<vertex> points = null; 
    if (PointsPerClass.ContainsKey(key)) 
     points = PointsPerClass[key]; 
    else { 
     points = new List<vertex>(); 
     PointsPerClass.Add(key, points); 
     FillStaticVertices(points); 
    } 

    // CreateObjectFromPoints is an abstract method implemented by descendants 
    GameObject gameObj = CreateObjectFromPoints(points); 
    // apply textures, rotations, etc 

    return gameObj; 
}