1
30
典型的方法是使用“复制构造函数”模式LaC++:
另一种方法是
这两种方法都要求层次结构中的所有类都遵循模式。哪一个是首选的。
如果您只是有任何随机类实现
|
2
7
尝试序列化技巧:
|
3
7
警告:使用此代码时应非常小心。自担风险使用。这个例子是按原样提供的,没有任何形式的保证。 在对象图上执行深度克隆还有另一种方法。在考虑使用此样本时,务必注意以下几点: 欺骗:
那你为什么要用它呢? 赞成的意见:
代码使用: 你只需要用一个对象来调用它:
或者假设您有一个子对象,并且订阅了它的事件…现在您要克隆该子对象。通过提供对象列表 不 克隆,可以保留对象图的一些药水:
实施: 现在让我们先把简单的东西拿开…这里是入口点:
现在这已经足够简单了,它只是在克隆期间为对象构建一个字典映射,并用任何不应该被克隆的对象填充它。您将注意到字典中提供的比较器是一个引用比较器,让我们看看它的作用:
这很简单,只是一个强制使用系统的比较器。现在是艰苦的工作:
您将立即注意到数组和委托副本的特殊情况。每个都有自己的原因,第一个数组没有可以克隆的“members”,因此您必须处理这个问题,并依赖shallow clone()成员,然后克隆每个元素。至于代表呢 可以 没有特殊情况下工作;但是,这样做会更安全,因为它不会复制runtimemethodhandle之类的东西。如果您打算从核心运行时(如system.type)在层次结构中包含其他内容,我建议您以类似的方式显式地处理它们。 最后一种情况最常见的是 粗略地 二进制格式化程序使用的相同例程。这些允许我们从原始对象中弹出所有实例字段(公共或私有),克隆它们,并将它们粘贴到一个空对象中。这里的好处是GetUninitializedObject返回一个新实例,该实例上没有运行ctor,这可能会导致问题并降低性能。 上面的工作与否很大程度上取决于您的特定对象图和其中的数据。如果您控制了图中的对象,并且知道它们没有引用像线程这样的愚蠢的东西,那么上面的代码应该可以很好地工作。 测试: 以下是我最初写的测试方法:
最后注意事项: 老实说,那是一次有趣的锻炼。在数据模型上进行深度克隆通常是一件好事。今天的现实是,大多数数据模型都是由一个生成的深度克隆程序生成的,这会破坏上面黑客的有用性。我强烈建议您生成数据模型,它能够执行深度克隆,而不是使用上面的代码。 |
4
2
最好的方法是序列化对象,然后返回反序列化副本。它将获取关于对象的所有信息,除了那些标记为不可序列化的信息,并使继承序列化变得容易。
这不是最能发挥作用的事情,但也不是最好的选择:让步。这个选项的好处是它可以无缝继承。 |
5
0
|
6
0
我认为您在这里没有正确地实现ICloneable;它需要一个没有参数的clone()方法。我的建议是:
请注意,copyObject()基本上是object.memberWiseClone(),假定您所做的不仅仅是复制值,您还将克隆属于类的任何成员。 |
7
0
尝试使用以下内容[使用关键字“new”]
|
8
-1
你应该使用
|
juiceb0xk · 运行安装程序时更改程序包名称。py公司 6 年前 |
vince · 角反应形式的深度复制? 6 年前 |
rener172846 · 如何在Haxe中克隆动态对象? 6 年前 |
Hemispherr · git克隆的权限被拒绝 7 年前 |
Jason · 克隆模板时如何更改内部div? 7 年前 |
yuppo · git属性中忽略了负面模式 7 年前 |