24 mars 2009
AS3 : Copier un objet
Il est parfois utile de copier un objet dans une variable afin d’effectuer des traitements sans pour autant modifier l’objet d’origine. Cependant, au sein d’une méthode statique, cette technique ne permet pas de garder l’objet d’origine intacte. Voici donc la marche à suivre pour créer une véritable copie d’un objet.

Prenons un exemple simple composé de trois objets : Canard, Caneton et CanardModifier.
Canard contient une instance de Caneton qui est utilisée dans deux méthodes _firstMethod et _secondMethod. Chacune de ses méthodes font appel à la méthode statique modifieCanneton de CanardModifier. Aller, moins de blabla, plus de concret voici le code.
Canard
package { public class Canard { private var _canneton : Canneton; public function Canard() : void { _canneton = new Canneton(); _firstMethod(); } private function _firstMethod() : void { var cannetonCopy : Canneton = CanardModfier.modifieCanneton(_canneton, "fifi"); trace(this, "_firstMethod", _canneton.who); trace(this, "_firstMethod", cannetonCopy.who); _secondMethod(); } private function _secondMethod() : void { var cannetonCopy : Canneton = CanardModfier.modifieCanneton(_canneton, "loulou"); trace(this, "_firstMethod", _canneton.who); trace(this, "_firstMethod", cannetonCopy.who); } } }
Canneton
package { public class Canneton { public var who : String = "riri"; } }
CanardModifier
package { public class CanardModfier { public static function modifieCanneton(canneton : Canneton, newName : String) : Canneton { var cannetonCopy : Canneton = canneton; cannetonCopy.who = newName; return canneton; } } }
Et voici ce que nous trace Canard lors de son exécution :
[object Canard] _firstMethod fifi [object Canard] _firstMethod fifi [object Canard] _firstMethod loulou [object Canard] _firstMethod loulou
Or avec une copie classique nous aurions dut obtenir riri, fifi, riri, loulou (pas de modification de l’objet _canneton).
Voici la modification à effectuer sur CanardModifier pour que celui-ci créer une vraie copie du paramètre canneton à l’aide d’un byteArray.
package { import flash.net.registerClassAlias; import flash.utils.ByteArray; import flash.utils.getQualifiedClassName; public class CanardModfier { public static function modifieCanneton(canneton : Canneton, newName : String) : Canneton { registerClassAlias (getQualifiedClassName(canneton).split('::').join('.') ,Canneton); var byteCanneton : ByteArray = new ByteArray (); byteCanneton.writeObject(canneton); byteCanneton.position = 0; var cannetonCopy : Canneton = byteCanneton.readObject() as Canneton; cannetonCopy.who = newName; return cannetonCopy; } } }
Et en utilisant cette nouvelle méthode le résultat obtenu est le bon :
[object Canard] _firstMethod riri [object Canard] _firstMethod fifi [object Canard] _firstMethod riri [object Canard] _firstMethod loulou
Voilà, vous savez désormais copier un objet dans une méthode statique, à vous d’adapter le code (je ne vais pas détailler, c’est assez simple).
En espérant que ce sera utile à certains.

Laisser un commentaire