gpt4 book ai didi

c# - 我需要使用继承来实现 C# 深拷贝构造函数。有哪些图案可供选择?

转载 作者:可可西里 更新时间:2023-11-01 08:00:31 26 4
gpt4 key购买 nike

我希望在 C# 中实现类层次结构的深层复制

public Class ParentObj : ICloneable
{
protected int myA;
public virtual Object Clone ()
{
ParentObj newObj = new ParentObj();
newObj.myA = theObj.MyA;
return newObj;
}
}

public Class ChildObj : ParentObj
{
protected int myB;
public override Object Clone ( )
{
Parent newObj = this.base.Clone();
newObj.myB = theObj.MyB;

return newObj;
}
}

这将不起作用,因为只有父对象的克隆子对象是新版的。在我的代码中,一些类具有很大的层次结构。

推荐的做法是什么?在不调用基类的情况下克隆每个级别的所有内容似乎是错误的?这个问题一定有一些巧妙的解决方案,它们是什么?

我能感谢大家的回答吗?看到一些方法真的很有趣。我认为如果有人给出一个完整的反射(reflection)答案的例子会很好。 +1 等待!

最佳答案

典型的方法是使用 C++ 中的“复制构造函数”模式:

 class Base : ICloneable
{
int x;

protected Base(Base other)
{
x = other.x;
}

public virtual object Clone()
{
return new Base(this);
}
}

class Derived : Base
{
int y;

protected Derived(Derived other)
: Base(other)
{
y = other.y;
}

public override object Clone()
{
return new Derived(this);
}
}

另一种方法是在 Clone 的实现中使用 Object.MemberwiseClone - 这将确保结果始终是正确的类型,并允许覆盖扩展:

 class Base : ICloneable
{
List<int> xs;

public virtual object Clone()
{
Base result = this.MemberwiseClone();

// xs points to same List object here, but we want
// a new List object with copy of data
result.xs = new List<int>(xs);

return result;
}
}

class Derived : Base
{
List<int> ys;

public override object Clone()
{
// Cast is legal, because MemberwiseClone() will use the
// actual type of the object to instantiate the copy.
Derived result = (Derived)base.Clone();

// ys points to same List object here, but we want
// a new List object with copy of data
result.ys = new List<int>(ys);

return result;
}
}

这两种方法都要求层次结构中的所有类都遵循该模式。使用哪一个是偏好问题。

如果您只是有任何随机类实现了 ICloneable 而没有实现保证(除了遵循 ICloneable 的文档语义之外),则无法扩展它。

关于c# - 我需要使用继承来实现 C# 深拷贝构造函数。有哪些图案可供选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1573453/

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