2011-04-24 78 views
2

我有一個類:C#創建從一個繼承類構造一類

class Cube 
{ 
    public string Name; 
    public string TexturePath; 
} 

而且繼承Cube

class DrawableCube : Cube 
{ 
    public Texture2D Texture; 
    public Shader Shader; 
} 

假設我有Cube的集合,我想打開另一個類到DrawableCube。如果不創建一個以Cube作爲參數並複製所有屬性的構造函數,如何使用生成的類型DrawableCube複製Cube

+5

此代碼是邪惡的,你聲明瞭兩個名稱相同的公共成員除了資本是不同類型的... – alternative 2011-04-24 21:12:43

+2

我想你所談論的是去除的樣板。據我所知,不可能在不復制所有價值的情況下做到這一點;你爲什麼首先要做這件事? – alternative 2011-04-24 21:14:00

+0

@mathepic對不起,我輸入它倉促。固定 – Hannesh 2011-04-24 21:18:48

回答

6

恕我直言,這裏最好的解決方案並不是從Cube繼承DrawableCube,而是讓UI類DrawableCube保留對數據類Cube的內部引用。但是,Cube可能應該設計爲immutable class。這樣DrawableCube將需要一個構造採取Cube,但你不必複製所有它的屬性,你可以存儲給出參考:

class DrawableCube : 
{ 
    private myCube; 

    public DrawableCube(Cube c) 
    { 
     myCube=c; 
    } 
} 
+0

'DrawableCube'幾乎可以肯定是'Cube',所以這打破了OOP多態性。 – alternative 2011-04-24 21:23:49

+1

我認爲你是對的。我可能生活在這裏沒有繼承。要在Portal 2中引用GLaDOS,「最好的解決方案通常是最簡單的」 – Hannesh 2011-04-24 21:33:00

+1

@mathepic:這裏問的問題是,在這裏,'Cube'和'DrawableCube'確實需要多態性。如果是這種情況,他們應該有一個共同的基類或接口'ICube'。這將導致*代理設計模式*(http://en.wikipedia.org/wiki/Proxy_pattern),其中DrawableCube是Cube的代理。 – 2011-04-24 21:36:58

0

既然你不想要一個構造函數,我想唯一的其他選擇是工廠模式。

+0

一個構造函數是好的,但我不想手動複製值。 (如果有人決定向立方體添加新字段,該怎麼辦?) – Hannesh 2011-04-24 21:17:14

+1

您的整個設計似乎都是問題所在。 – 2011-04-24 21:18:20

+0

您認爲我應該在沒有繼承的情況下執行此操作,然後創建一個只包含Cube的DrawableCube類? – Hannesh 2011-04-24 21:21:04

1

警告:以下解決方案是醜陋的,但它是幹什麼的你要。

品牌Cube在其構造函數中採用CubeInformation類型的單個參數,並且它是唯一的成員(它是私有的)。它只是設置CubeInformation。然後它爲該結構中的東西提供屬性。

CubeInformation是包含Cube的數據的結構。

DrawableCube擁有一個構造函數,該構造函數需要Cube並從Cube複製CubeInformation結構。

瓦拉。如果有人必須向Cube添加更多數據,他們將它添加到CubeInformation結構中並實現Cube中的屬性。 DrawableCube不需要維護。

1

如果您想將Cube的集合轉換爲DrawableCube的集合,那麼繼承可能不是正確的工具。

給聚集一試:

class DrawableCube //: Cube 
{ 
    public Cube TheCube { get; private set; } 
    public DrawableCube (Cube c) { TheCube = c; } 
    public Texture2D Texture; 
    public Shader Shader; 
}