gpt4 book ai didi

c# - C# 类层次结构中的深层复制/克隆方法 - 我是否需要在任何地方都进行具体实现?

转载 作者:太空狗 更新时间:2023-10-29 21:45:50 30 4
gpt4 key购买 nike

假设我有以下类层次结构(包括基本接口(interface)):

IAction -> (abstract) BaseAction -> (concrete) ImmediateAction -> (concrete) MovementAction

现在,假设 IAction 公开了一个方法(好吧,IAction 实现的确实是一个不同的接口(interface),但让我们在这里保持简单!):

// Returns a new IAction instance deep copied from the current instance.
IAction DeepClone();

到目前为止还好吗?我们有深度复制方法,ImmediateAction 有一些需要复制的属性,因此它不仅会提供 DeepClone() 的实现,还会提供复制构造函数:

//Base Action implementation
protected BaseAction(BaseAction old)
{
this.something = old.something;
}

//Immediate Action Implementation
protected ImmediateAction(ImmediateAction old)
: base(old)
{
this.anything = old.anything;
}

public IAction DeepClone()
{
return new ImmediateAction(this);
}

现在,假设 MovementAction 里面没有任何与 DeepClone() 相关的东西,所以它没有实现方法或复制构造函数。

我遇到的问题是:

IAction x = new MovementAction();
IAction y = x.DeepClone();

//pleaseBeTrue is false
bool pleaseBeTrue = y is MovementAction;

现在,我明白这是怎么回事了——MovementAction 没有实现 DeepClone(),所以调用了 ImmediateAction.DeepClone() ,它实例化了一个新的 ImmediateAction。因此,上例中 y 的类型是 ImmediateAction 而不是 MovementAction

所以,在这个冗长的序言之后,我的问题是:这种情况的最佳实践是什么?我卡住了吗?我是否只是必须为层次结构中的每个类无论如何实现一个DeepClone()方法?我在这里使用的模式是否不正确,是否有更好的方法

最后一点:如果可能的话,我想避免反射(reflection)。

最佳答案

可以使用扩展方法并进行增量克隆

public static class DeepCopyExt
{
public static T DeepCopy<T>(this T item)
where T : ThingBase, new()
{
var newThing = new T();
item.CopyInto(newThing);
return newThing;
}
}

public abstract class ThingBase
{
public int A { get; set; }

public virtual void CopyInto(ThingBase target)
{
target.A = A;
}
}

public class ThingA : ThingBase
{
}

public class ThingB : ThingA
{
public int B { get; set; }

public override void CopyInto(ThingBase target)
{
var thingB = target as ThingB;

if(thingB == null)
{
throw new ArgumentException("target is not a ThingB");
}

thingB.B = B;
base.CopyInto(thingB);
}
}

class Program
{
static void Main(string[] args)
{
var b = new ThingB
{
A = 1,
B = 3
};

//c is ThingB
var c = b.DeepCopy();

var b1 = new ThingA
{
A = 1,
};

//c1 is ThingA
var c1 = b1.DeepCopy();

Debugger.Break();
}
}

关于c# - C# 类层次结构中的深层复制/克隆方法 - 我是否需要在任何地方都进行具体实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12965841/

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