C#复制具有继承的未知类型的二维数组(栅格)

C#复制具有继承的未知类型的二维数组(栅格),c#,types,grid,copy,C#,Types,Grid,Copy,假设我们有一个抽象的基类a: abstract class A { //code for class A } 我们还有一个子类B,它继承自a并包含一个复制构造函数: class B : A { //some other membervariables and methods public B (B copy) { //makes a copy } } 现在假设我们创建了一个要从a继承的类GridObject,它包含的网格元素也是a的类型,但可能是B的类型或从a

假设我们有一个抽象的基类a:

abstract class A {
  //code for class A
}
我们还有一个子类B,它继承自a并包含一个复制构造函数:

class B : A {

  //some other membervariables and methods  

  public B (B copy) {
    //makes a copy
  }
}
现在假设我们创建了一个要从a继承的类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);
bb=新的B();
GridObject GridObject=新的GridObject(5,5);
对于(int x=0;x<5;x++)
对于(int y=0;y<5;y++)
添加(新的B(B),x,y);

现在,为类GridObject实现(深度)复制构造函数的最佳方法是什么?请注意,我们的gridObject的元素现在是类型B。但这也可能是从A继承的任何其他任意类。

请查看在A中实现
System.IConeable
[1],然后为每个继承类重写该类。然后,每个类都可以负责知道如何克隆自己


[1]

有关一般的深度复制帮助器方法,请参阅问题

但我不确定你们的班级是否应该负责制作副本。一个物体可能位于两个位置吗?显然,我没有看到完整的实现,因此我可能错过了用例,但我会这样做:

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);
bb=新的B();
GridObject GridObject=新的GridObject(5,5);
对于(int x=0;x<5;x++)
对于(int y=0;y<5;y++)
Add(b.DeepClone(),x,y);

请注意,我将副本传递到构造函数中,而不是依赖构造函数为我制作副本。

我在这里看到了DeepCopy()方法的有用性。它应该可以工作,而不是复制构造函数。但是我不知道如何在程序中实现这个方法。什么应该扩展并标记为[可序列化]?假设我要克隆gridObject:
gridObject gridObjectCopy=gridObject.DeepCopy()您需要将可序列化属性添加到类中
[Serializable]类GridObject:A{…
。链接的问题有一个常规的静态方法,您可以调用,还有一个(在我的示例中使用)。您可以创建一个新的静态类(例如称为实用工具)并将该方法粘贴到其中。如果您使用常规的静态版本,您可以像
实用工具.DeepClone(GridObject)一样调用它
。如果使用扩展方法,可以像
gridObject.DeepCopy()那样调用它
。我明白了,这对于定制类来说是一个很好的解决方案,但不使用其他框架。在我的情况下,我使用的是这个框架,所以它不起作用,因为它无法为对象创建深度副本,例如,因为它们没有标记为可序列化。我想我应该首先提到这一点,对不起。