复制类的实例

时间:2010-12-07 16:42:58

标签: flex class

好的,ObjectUtil.copy是一种很好的复制对象的技术。但是在使用它来复制其他类有很多问题之后,我想这不是我想要的解决方案。

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

很酷的是,大多数变量都是通过flex引用传递的,但有时很烦人无法控制它(对不起,我已经习惯了普通的C)。

谢谢!

更新:

更确切地说,因为我不能使ObjectUtil.copy()与自定义类一起工作...有没有办法通过序列化来复制自定义类?您是否成功使用了带有自定义类的ByteArray副本?

感谢所有回复。

4 个答案:

答案 0 :(得分:3)

如果您确定在您的情况下实施clone接口不正确,我建议您查看ByteArray对象。我自己没有使用它,但它似乎可以为您提供所需的控制权,而不是单个字节。您可以readingwriting来自任何对象。

Senocular快速概述了它here

function clone(source:Object):* {
  var copier:ByteArray = new ByteArray();
  copier.writeObject(source);
  copier.position = 0;
  return(copier.readObject());
}
祝你好运!

答案 1 :(得分:3)

ObjectUtil.copy 在内部使用 ByteArray 来创建副本。为了使副本成功,ByteArray要求flash播放器将知道您的自定义类。您可以使用全局 registerClassAlias 方法注册课程。

例如:

//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))

答案 2 :(得分:2)

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

(请原谅我,如果语法有点偏,那已经有一段时间了)

// define a "cloneable" interface
public interface ICloneable {
  function clone() : Object;
}

对于每个班级,实施方法......

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类上采用了Object方法。我知道ActionScript的Object类没有类似的方法。

答案 3 :(得分:0)

两个常用的习语:

  • 一个clone方法
  • 复制构造函数

这两个版本都可以让您定义复制的确切含义 - 您可能希望将某些内容轻微复制,而将其他内容深深复制。