假設我們有一個基類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繼承的任何其他任意類。
我在這裏看到了DeepCopy()方法的用處。它應該工作而不是複製構造函數。但我不明白如何在程序中實現此方法。什麼應該擴展和標記爲[Serializable]?假設我想克隆gridObject:'GridObject gridObjectCopy = gridObject.DeepCopy();' – Quantum
您可以將Serializable屬性添加到您的類中。 '[Serializable]類GridObject:一個{...'。鏈接的問題有一個可以調用的常規靜態方法,並有一個[擴展方法](http://msdn.microsoft.com/en-us/library/bb383977.aspx)(在我的示例中使用)。您可以創建一個新的靜態類(例如稱爲Utility)並將該方法粘貼到其中。如果你使用普通的靜態版本,你可以把它叫做'Utility.DeepClone(gridObject)'。如果你使用擴展方法,你會像'gridObject.DeepCopy()'一樣調用它。 – Chris
我看到,這將是一個很好的解決方案,而不使用其他框架的自定義類。在我的情況下,我使用[XNA](http://create.msdn.com/en-US/),所以它不起作用,因爲它無法爲[Texture2D](http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.texture2d.aspx) ,因爲它們沒有被標記爲可序列化。我想我應該首先提到這一點,對不起。 – Quantum