AS3 — Клонировать объект класса, когда класс имеет параметризованный конструктор

#flash #actionscript-3 #class #cloning

#flash #actionscript-3 #класс #клонирование

Вопрос:

Я хочу клонировать объект класса. Я попробовал следовать отсюда:

 package
{
    import flash.net.registerClassAlias;
    import flash.utils.ByteArray;

    public class MyClass
    {
        public var property1:String;
        public var property2:Array;

        public function clone():MyClass
        {
            registerClassAlias("MyClass", MyClass);

            var bytes:ByteArray = new ByteArray();
            bytes.writeObject(this);
            bytes.position = 0;

            return bytes.readObject() as MyClass;
        }
    }
}
  

НО это работает только тогда, когда у класса есть конструктор по умолчанию, а не когда у него есть параметризованный конструктор:

Есть идеи о том, как клонировать объект класса, когда класс имеет параметризованный конструктор?

С уважением

Ответ №1:

Это лучшее, что я мог для вас сделать:

 package
{

    import flash.display.Sprite;


    public class Thing extends Sprite
    {

        // Cloneable properties.
        private var _cloneable:Array = ["x","y","val1","val2"];


        // Properties.
        public var val1:uint = 10;
        public var val2:String = "ten";


        /**
         * Returns a new Thing with the same properties.
         */
        public function clone():Thing
        {
            var t:Thing = new Thing();

            for each(var i:String in _cloneable)
            {
                t[i] = this[i];
            }

            return t;
        }

    }

}
  

Все, что вам нужно сделать, это добавить свойства, которые вы хотите иметь, способные к клонированию _cloneable

Пример использования:

 var thing:Thing = new Thing();

thing.x = 15;
thing.y = 10;
thing.val1 = 25;
thing.val2 = "twentyfive";

// Clone initial Thing.
var thing2:Thing = thing.clone();

trace(thing2.x, thing2.y, thing2.val1, thing2.val2); // 15 10 25 twentyfive
  

Ответ №2:

Вы можете создать класс с конструктором, который имеет необязательные параметры. Это хорошая практика с точки зрения разработки на основе тестирования и производительности.

Ответ №3:

Мое предложение состояло бы в том, чтобы не делать это слишком сложным и не переусердствовать. На самом деле нет необходимости делать что-либо более сложное, чем это.

  public function clone():Thing {
     var t:Thing = new Thing();

     t.x = this.x;
     t.y = this.y;
     t.val1 = this.val1;
     t.val2 = this.val2;

     return t;
 }
  

и если у вас есть параметры в вашем конструкторе.

 public function Thing(x:int,y:int) {
    this.x = x;
    this.y = y;
}

public function clone():Thing {
    var t:Thing = new Thing(this.x, this.y);

    t.val1 = this.val1;
    t.val2 = this.val2;

    return t;
}
  

Мне нравится другой ответ, он умный, но требует много усилий для простой настройки некоторых свойств. Не переоценивайте проблему.