Копирование экземпляра класса - PullRequest
3 голосов
/ 07 декабря 2010

Хорошо, ObjectUtil.copy - хорошая техника для копирования объектов.Но после многих проблем, связанных с использованием его для копирования других классов, я думаю, что это не то решение, к которому я стремлюсь.

Как бы вы подошли к копированию / клонированию экземпляров определенного вами класса?Может быть, определение функции с помощью класса для ее копирования?

Круто, что большинство переменных передаются по ссылке в flex, но иногда раздражает отсутствие контроля над этим (извините, я слишком привык к простому C).

Спасибо!

ОБНОВЛЕНИЕ:

Точнее, я не могу заставить ObjectUtil.copy () работать с пользовательским классом ...Есть ли способ скопировать, используя сериализацию, пользовательский класс?Вы успешно использовали копию ByteArray с пользовательским классом?

Спасибо за все ответы.

Ответы [ 4 ]

3 голосов
/ 07 октября 2013

ObjectUtil.copy использует ByteArray для создания внутренней копии. Чтобы копия была успешной, ByteArray требует, чтобы флеш-плеер знал о вашем пользовательском классе. Вы делаете это, регистрируя свой класс, используя глобальный метод 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))
3 голосов
/ 07 декабря 2010

Если вы решите, что реализация интерфейса clone не является правильным подходом в вашей ситуации, я предлагаю посмотреть на объект ByteArray. Я не использовал его сам, но, похоже, он дает вам весь необходимый контроль над отдельными байтами. Вы можете читать и писать с любого объекта.

Senocular делает краткий обзор этого здесь .

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

Удачи!

2 голосов
/ 07 декабря 2010

Если у вас есть контроль над всей иерархией классов, я рекомендую реализовать интерфейс 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.

0 голосов
/ 07 декабря 2010

Две общие идиомы:

  • a clone метод
  • конструктор копирования

Оба из них позволяют вам определить, что именно означает создание копии - вы можете захотеть, чтобы некоторые вещи копировались поверхностно, а другие - глубоко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...