gpt4 book ai didi

c# - 如何克隆从 C# 中的抽象类派生的类实例的通用列表?

转载 作者:行者123 更新时间:2023-12-02 17:51:45 25 4
gpt4 key购买 nike

我有一个基类:abstract class Base和一些派生类:class Derived: Base ,所有数据成员都在基类中。我有另一个通用列表:List<Base> list .现在我想执行 Clone() list 上的操作。我读过 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;
}

可以看到两个列表的元素是相同的。

最佳答案

我不明白为什么 Base 不能实现 ICloneable:

public abstract class Base : ICloneable
{
public object Clone()
{
return MemberwiseClone();
}
}

当在派生类上调用时,它仍然会返回正确的实例(即与现有对象相同的类型)。派生类中的任何字段也将被复制——尽管是一种浅显的方式。举个具体的例子:

using System;

public abstract class BaseClass : ICloneable
{
public object Clone()
{
return MemberwiseClone();
}
}

public class Derived : BaseClass
{
private readonly string name;

public Derived(string name)
{
this.name = name;
}

public override string ToString()
{
return "Derived with name " + name;
}
}

class Test
{
static void Main(string[] args)
{
BaseClass b = new Derived("fred");

object clone = b.Clone();
Console.WriteLine(clone.ToString());
}
}

编辑:我怀疑你想要这样的东西:

public abstract class ObjectThatHasPosition : ICloneable
{
public Point CurrentPosition { get; set; }
public ObjectThatHasPosition(Point p)
{
CurrentPosition = p;
}

public object Clone()
{
var clone = (ObjectThatHasPosition) MemberwiseClone();
clone.CurrentPosition = (Point) CurrentPosition.Clone();
}
}

关于c# - 如何克隆从 C# 中的抽象类派生的类实例的通用列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7340279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com