Una opción, sin duda el más ágil, sería definir métodos de clones para cada clase que necesita clonar, tales como:
class Ship
{
public var prop1:Number;
public var otherClassInstance:OtherClass;
public function clone():Ship
{
var result:Ship = new Ship();
result.prop1 = this.prop1;
result.otherClassInstance = this.otherClassInstance.clone()
}
}
class OtherClass
{
public var prop1:Number;
public function clone():OtherClass
{
var result:OtherClass = new OtherClass();
result.prop1 = this.prop1;
}
}
Otra opción es clonar un objeto utilizando la clase ByteArray como este ejemplo de la documentación de Adobe:
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
he visto casos en los que este enfoque no funciona para la clonación de instancias de clases personalizadas, ver específicamente clases como Sprites.
Otro enfoque es utilizar describeType
del paquete flash.utils
. Con describeType
puede recorrer las propiedades de un objeto.
Aquí hay un ejemplo del uso de describeType
para inspeccionar las propiedades de un objeto que forma parte de un utils lib que escribí.
En cuanto a la comprobación del tipo de la propiedad, puede utilizar describeType
o también puede utilizar el operador is
así:
if(myObj is SomeClass)
{
}
if(myObj is OtherClass)
{
}
Creo que tendré que hacer su primera sugerencia, aunque esto tiene el problema de si agrego nuevas variables a mis clases, tendré que agregar nuevas líneas a clone() cada vez. –
Eso tiene ventajas también. Quizás desee establecer un valor predeterminado si no se establece ningún valor o si desea clonar algunos accesorios y otros no. Un enfoque automatizado que utiliza describeType no sería demasiado flexible. – JeremyFromEarth