2009-02-27 27 views
2

actionscript:Actionscript'te bir değişken olarak bir değişken iletmek mümkün mü? Ben</em> gibi görünür yazmak istiyorum <em>

public function API(requestClass:Type=URLLoader) { 
    var req:URLLoader = new requestClass(new URLRequest("some url")); 
    req.load(url); 
    //etc 
} 

Ben URLLoader bir alay alt sınıfta ileterek API sınıfını test edebilirsiniz böylece. Bu, Actionscript'in tip sisteminde mümkün görünmüyor. Alternatif olarak, çalışma zamanında URLLoader'ın load() yöntemini değiştirmek için yeterli olabilir. Üste | Ben bir test yönteminde bu kodu için yüksek umutları vardı:

var b:Array = []; 
URLLoader.prototype.load = function(u:URLRequest):void { 
    b.push(u); 
} 
(new URLLoader()).load(new URLRequest("http://localhost")); 
assertEquals(b.length, 1); 

ama URLLoader aslında verdi url ve b.length == Yani 0.

çağrı yok! API sınıfımda test mantığını koymadan API sınıfımı test edilebilir hale getirmenin herhangi bir yolu var mı? Bariz bir şeyi özledim mi?

cevap

3

kavram AS3'te mükemmel çalışıyor nontheless Verdiğiniz kod hataların bir çift vardır. Aşağıdaki kod, örneğin, derler ve kusursuz çalıştırır:

package { 
    import flash.display.Sprite; 

    public class Main extends Sprite { 
     public function Main():void { 
      trace(getDynObj()); 
      trace(getDynObj(Number)); 
      trace(getDynObj(String)); 
     } 

     public function getDynObj(requestClass:Class = null):* { 
      var req:* = new (requestClass || int)("16.51"); 
      return req; 
     } 
    } 

} 

ve çıkışları:

public function API(requestClass:Class = null):void { 
    var req:* = new (requestClass || URLLoader)(new URLRequest("some url")); 
    //etc 
} 

Not: URLLoader

16 
16.51 
16.51 

Yani, işlevi aşağıdaki değişiklikleri ihtiyacı constructor argümanı olarak düz bir dizgi kabul etmez, dizeyi bir URLRequest nesnesine sarmanız gerekir.

+0

Sınıf sınıfı tam olarak aradığım şeydi, ben de tahmin ettim ama bir sınıf için varsayılan bir parametreye sahip olamayacağınız gerçeği yüzünden atıldı (http://is.gd/l8p9). Bir URLLoader'ın nasıl oluşturulacağının farkındayım, sadece sahte kod yazıyordum, ancak yazıyı güncelledim. – llimllib

+0

Vay, hakkında bilmiyordum || yeni operatörün içinde operatör olmak mümkün! – Karthik

+0

Doğru bir şekilde anlıyorsam, null yanlıştır. Kullanım alanları! – apscience

1

flash.utils paketine bakın. Özellikle, işlev: getDefinitionByName(). Bu bağlantının hoşunuza gidecek hoş bir yansıması var. Sen (tabii ki uygun modifikasyonlar sonra) bu deneyin edebilirsiniz:

public function API(mock:Object, type:String) { 
    var ClassReference:Class = getDefinitionByName(type) as Class; 
    var instance:Object = new ClassReference(); 
//instance.load(url); -- play around with your new class! 

} 
+0

Tip değişkeni Sınıf tipine sahip değildiniz ve bu ilk adımı atlayamadınız mı? – Herms