#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;
}
Мне нравится другой ответ, он умный, но требует много усилий для простой настройки некоторых свойств. Не переоценивайте проблему.