2011-05-09 64 views
1

我想克隆一个类对象。我试图从here如下:AS3 - 类具有参数化构造函数时的克隆类对象

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; 
     } 
    } 
} 

但这只是工作的时候班里有一个默认的构造函数,而不是当它参数的构造函数:

如何克隆一个类对象时,类有任何想法,参数化的构造函数?

问候

回答

2

这是最好的,我可以为你做:

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 
+0

感谢您的帮助。问候 – user427969 2011-05-12 05:35:03

0

我的建议是不要让它太复杂d而不是在想事情。实际上没有必要做比这更复杂的事情。

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; 
} 

我喜欢其他答案,它很聪明,但很多只是设置一些属性的流失。不要过度考虑问题。

0

您可以创建一个具有可选参数的构造函数的类。从测试驱动开发和性能点来看,这是一个很好的做法。

相关问题