【发布时间】:2011-09-07 20:41:26
【问题描述】:
我有一个基类:abstract class Base 和一些派生类:class Derived: Base,所有数据成员都在基类中。我还有另一个通用列表:List<Base> list。现在我要对列表执行Clone() 操作。我读过this thread,但发现我的情况有点复杂。由于基类是抽象的,所以列表的元素不能通过复制构造函数或实现ICloneable接口来克隆。但是由于所有数据成员都在基类中,因此一次又一次地编写相同的代码用于在派生类中克隆将是多余的。完成这项工作的最佳方法是什么?感谢您提供提示。
更新:附上简化的源代码
public class Point : ICloneable
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{ X = x; Y = y; }
public Point(Point p)
{
X = p.X; Y = p.Y;
}
public object Clone()
{
return MemberwiseClone();
}
}
public abstract class ObjectThatHasPosition : ICloneable
{
public Point CurrentPosition { get; set; }
public ObjectThatHasPosition(Point p)
{ CurrentPosition = new Point(p); }
public object Clone()
{
return MemberwiseClone();
}
}
public class Man : ObjectThatHasPosition
{
public Man(Point p) : base(p) { }
}
static class Extensions
{
public static List<ObjectThatHasPosition> Clone(this List<ObjectThatHasPosition> src)
{
List<ObjectThatHasPosition> dst = new List<ObjectThatHasPosition>(src.Count);
src.ForEach((item) => { dst.Add((ObjectThatHasPosition)item.Clone()); });
return dst;
}
}
static void Main(string[] args)
{
List<ObjectThatHasPosition> firstList = new List<ObjectThatHasPosition>();
firstList.Add(new Man(new Point(0, 0)));
List<ObjectThatHasPosition> anotherList = firstList.Clone();
firstList[0].CurrentPosition.X = 1;
}
可以看到两个列表的元素是相同的。
【问题讨论】:
-
请解释为什么“不能通过...实现 ICloneable 接口进行克隆”。抽象类中没有任何东西可以阻止接口的实现(即,如果你想强制派生类实现它,可以通过抽象函数......)
-
我认为 Clone() 必须调用复制构造函数,所以...
-
你也可以在 Base 中实现一个拷贝构造函数,可以通过继承的类构造函数调用。也没有什么可以阻止的。
标签: c# clone abstract-class generic-list