Apache flex 复制类的实例

Apache flex 复制类的实例,apache-flex,class,Apache Flex,Class,好的,ObjectUtil.copy是复制对象的好方法。但是在使用它复制其他类时遇到了很多问题,我想这不是我想要的解决方案 如何复制/克隆已定义的类的实例?也许用类定义一个函数来复制它 在flex中,大多数变量都是通过引用传递的,这很酷,但有时无法控制这一点会让人恼火(对不起,我太习惯使用纯C了) 谢谢 更新: 更准确地说,由于我无法使ObjectUtil.copy()与自定义类一起工作,因此。。。有没有办法通过使用序列化来复制自定义类?您是否成功地将ByteArray副本与自定义类一起使用 感

好的,ObjectUtil.copy是复制对象的好方法。但是在使用它复制其他类时遇到了很多问题,我想这不是我想要的解决方案

如何复制/克隆已定义的类的实例?也许用类定义一个函数来复制它

在flex中,大多数变量都是通过引用传递的,这很酷,但有时无法控制这一点会让人恼火(对不起,我太习惯使用纯C了)

谢谢

更新:

更准确地说,由于我无法使ObjectUtil.copy()与自定义类一起工作,因此。。。有没有办法通过使用序列化来复制自定义类?您是否成功地将ByteArray副本与自定义类一起使用


感谢您的回复。

如果您可以控制整个类层次结构,我建议在每个类中实现
clone()
接口。这很乏味,但随着复杂性的增加,它会得到回报

(如果语法有点错误,请原谅,已经有一段时间了)

对于每个类,实现方法

public class MyClass1 implements ICloneable {
  ...
  public function clone() : Object {
    var copy:MyClass1 = new MyClass1();

    // copy member variables... if it is a user-defined object,
    // make sure you call its clone() function as well.

    return copy;
  }
}
要创建对象的副本,只需调用
clone()
函数

var copy:MyClass1 = original.clone();
作为旁注,Java和.NET似乎都在其基础
对象
类上采用了
clone
方法。我不知道ActionScript类的类似方法。

两个常见的习惯用法:

  • 一种
    克隆
    方法
  • 复制构造函数

这两种方法都可以让你定义复制的确切含义——你可能希望一些东西复制得很浅,而另一些东西复制得很深。

如果你认为在你的情况下实现
克隆
接口不是正确的方法,我建议你看看这个对象。我自己没有使用过它,但它似乎给了您对单个字节所需的所有控制。您可以从任何对象和从任何对象到任何对象

Seneyular对其进行了快速概述

祝你好运

ObjectUtil.copy在内部使用ByteArray创建副本。为了使复制成功,ByteArray要求flash player知道您的自定义类。您可以通过使用globalregisterClassAlias方法注册类来实现这一点

例如:

//one time globally to the application.
registerClassAlias(getQualifiedClassName(CustomClass), CustomClass); 

//then
var c1:CustomClass = new CustomClass();
c1.name = "customClass";
var c2:CustomClass = ObjectUtil.copy(c1);

trace(ObjectUtil.toString(c1))
trace(ObjectUtil.toString(c2))


您很难复制哪些类或对象?根据您的问题,听起来好像您正在尝试复制您创建的自定义类。是否存在未正确复制的类的对象或属性?多了解一些信息可能会有所帮助。:)是的,这些是自定义类,包含许多对象和属性。当我使用'var cclassins2:cclass=ObjectUtil.copy(cclassins1)作为cclass'时,我不会得到一个副本,而是一个null。因此,我猜该函数只适用于普通的“对象”类。我相信这是:的重复,也许您只是缺少了
registerClassAlias()
?我同意佐特尼的观点。这可能是最好的解决办法。我确实考虑过这样做。。。但是,我想知道,有没有办法复制实例的整个数据块?(据我所知,这是序列化)它似乎比复制每个变量对我来说都更为优化。我使用的另一种技术是创建一个接口,实现
toXML
fromXML
函数,但这听起来对您的场景也没有好处:-/请参阅我关于
ByteArray
的新答案。我想它能满足你的需求。祝你好运我必须在这里添加的唯一一点是,强烈建议在事件类上使用克隆方法。如果它们不存在,我相信一些问题是由冒泡事件引起的。谢谢你的回复,但我真的不在乎这个问题中克隆和复制的区别。flex的ObjectUtil中的Afaik克隆保留uid,而copy不。。。我认为这并没有太大改变这个问题,它更多地与实例复制/克隆的方法有关。无论如何,把这个问题当作是关于深度复制的问题。这是一种常见的方法,几乎与其他答案中提到的方法相同。谢谢!有趣的是,我在过去的某个时候使用过相同的函数(当然,我复制粘贴了它)。我不会以这种方式递归地删除所有引用(自定义类中的类和对象),但我想我可以将公开的两种方法结合起来。。。(在克隆函数中,首先使用此ByteArray方法复制数据,然后通过调用子对象自己的克隆函数更正子对象的数据)。还有其他方法吗?嗯。。。ByteArray方法不起作用。。。事实上,我想我以前在这门课上试过。更多关于这个稍后:染色。。。这与ObjectUtil.copy()使用的代码完全相同。它给了我一个null,就像我使用Object.clone()时一样(它调用了这个ByteArray副本并递归更正了uid)。我想知道为什么它不能与我的邪恶类一起工作……嗯……我并不奇怪
ObjectUtil.copy()
在内部使用它。我被难住了。你能指出类中某个特定的成员变量在复制过程中出错吗?我相信OP不知道他也需要做
registerClassAlias()
。此处的参考:
function clone(source:Object):* {
  var copier:ByteArray = new ByteArray();
  copier.writeObject(source);
  copier.position = 0;
  return(copier.readObject());
}
//one time globally to the application.
registerClassAlias(getQualifiedClassName(CustomClass), CustomClass); 

//then
var c1:CustomClass = new CustomClass();
c1.name = "customClass";
var c2:CustomClass = ObjectUtil.copy(c1);

trace(ObjectUtil.toString(c1))
trace(ObjectUtil.toString(c2))