2011-11-10 27 views
1

假設我們有一個基類A,其是抽象:C#複製2D陣列(柵格)具有繼承未知類型

abstract class A { 
    //code for class A 
} 

另外,我們有從A繼承,幷包含一個拷貝構造一個子類B:

class B : A { 

    //some other membervariables and methods 

    public B (B copy) { 
    //makes a copy 
    } 
} 

現在假設我們做,我們想從一個繼承類GridObject,它包含網格元素也是A型的,但也可能是B型或從A繼承其他任何類:

class GridObject : A { 
    A[,] grid; 

    public GridObject (int columns, int rows) { 
    grid = new A[columns, rows]; 
    } 

    public GridObject (GridObject copy) { 
    //makes a copy 
    } 

    public Add (A obj, int x, int y) { 
    grid[x,y] = obj; 
    } 

現在,我的問題是如何使複製構造函數,使GridObject的確切副本。假設我們這樣做:

B b = new B(); 
GridObject gridObject = new GridObject(5, 5); 
for (int x = 0; x < 5; x++) 
    for(int y = 0; y < 5; y++) 
    gridObject.Add(new B (b), x, y); 

現在,什麼是爲類GridObject實現(深)複製構造函數的最佳方法是什麼?請注意,我們的gridObject的元素現在是類型B.但是這也可能是從A繼承的任何其他任意類。

回答

0

對於泛型深拷貝輔助方法,見this SO問題。

我不確定你的類應該負責製作副本。有沒有機會讓一個物體在兩個地方?很顯然,我沒有看到全面實施,所以我可能會丟失的用例,但我會做這樣的事情:

B b = new B(); 
GridObject gridObject = new GridObject(5, 5); 
for (int x = 0; x < 5; x++) 
    for(int y = 0; y < 5; y++) 
    gridObject.Add(b.DeepClone(), x, y); 

注意,我傳遞的複製到構造,而不是依靠構造函數爲我製作副本。

+0

我在這裏看到了DeepCopy()方法的用處。它應該工作而不是複製構造函數。但我不明白如何在程序中實現此方法。什麼應該擴展和標記爲[Serializable]?假設我想克隆gridObject:'GridObject gridObjectCopy = gridObject.DeepCopy();' – Quantum

+0

您可以將Serializable屬性添加到您的類中。 '[Serializable]類GridObject:一個{...'。鏈接的問題有一個可以調用的常規靜態方法,並有一個[擴展方法](http://msdn.microsoft.com/en-us/library/bb383977.aspx)(在我的示例中使用)。您可以創建一個新的靜態類(例如稱爲Utility)並將該方法粘貼到其中。如果你使用普通的靜態版本,你可以把它叫做'Utility.DeepClone(gridObject)'。如果你使用擴展方法,你會像'gridObject.DeepCopy()'一樣調用它。 – Chris

+0

我看到,這將是一個很好的解決方案,而不使用其他框架的自定義類。在我的情況下,我使用[XNA](http://create.msdn.com/en-US/),所以它不起作用,因爲它無法爲[Texture2D](http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.texture2d.aspx) ,因爲它們沒有被標記爲可序列化。我想我應該首先提到這一點,對不起。 – Quantum