c#复制2D数组(网格)继承未知类型
本文关键字:继承 未知 类型 网格 复制 2D 数组 | 更新日期: 2023-09-27 18:14:25
假设我们有一个抽象基类a:
abstract class A {
//code for class A
}
还有一个继承自a的子类B,它包含一个复制构造函数:
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);
现在,为类GridObject实现(深度)复制构造函数的最佳方法是什么?注意,我们的gridObject的元素现在是B类型。但这也可能是继承自a的任意类。
看看在A中实现System.IConeable
[1],然后为每个继承类重写它。这样,每个类就可以负责知道如何克隆自己。
[1] http://msdn.microsoft.com/en-us/library/system.icloneable.aspx
关于一般的深度复制助手方法,请参阅这个问题。
我不确定你的班级是否应该负责制作副本。一个物体有可能同时出现在两个位置吗?显然,我没有看到完整的实现,所以我可能会错过用例,但我会这样做:
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);
请注意,我将副本传递给构造函数,而不是依赖构造函数为我创建副本。