C#复制具有继承的未知类型的二维数组(栅格)
假设我们有一个抽象的基类a: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
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()那样调用它
。我明白了,这对于定制类来说是一个很好的解决方案,但不使用其他框架。在我的情况下,我使用的是这个框架,所以它不起作用,因为它无法为对象创建深度副本,例如,因为它们没有标记为可序列化。我想我应该首先提到这一点,对不起。