2008-09-17 26 views
5

ile nasıl edinebilirim? Çok sayıda gömülü varlığa sahip bir sınıfa sahibim.Flex/AS3'te, gömülü öğenin sınıf tanımını getDefinitionByName

Sınıf içinde, bir varlığın sınıf tanımını ada göre tanımak istiyorum. GetDefinitionByName() yöntemini ve ayrıca ApplicationDomain.currentDomain.getDefinition() kullanmayı denedim, ancak ne işe yaramadı.

Örnek:

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    var ClassDef:Class = getDefinitionByName(name) as Class; //<<-- Fails 
    _image = new ClassDef() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

cevap

8

Bu sorunuza cevap vermez, ama sorununuzu çözebilir. Böyle bir şey çalışması gerekir yapıyor inanıyoruz:

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    _image = new this[name]() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

ben zor bir zaman braket notasyonu mühürlü sınıfları üzerinde çalışıp çalışmadığını hatırlamakta yaşıyorum. Değilse, sınıfı dinamik olarak işaretlemek basit bir çözümdür.

+0

Hey! Güzel iş, işe yaradı! – user8399

2

Herhangi bir fantezi getDefinitionByName() yöntemini kullanmanıza gerek yoktur, sadece dinamik olarak buna bakın. Durumunuzda 'Hatalar' satırını şu şekilde değiştirin:

var classDef:Class = MyClass[name] as Class; 

Ve bunu yapmalısınız.

+0

bu işe yarıyor! Teşekkürler davr – jedierikb

0

Çok teşekkür ederim! Ben sadece bir şeyler atmak için hazırdı getQualifiedClassName ile çalışmak için getDefinitionByName POS almaya çalışırken neredeyse 5 saat geçirdim! Son çalışma kodum böyle görünüyor ve dize adını bir diziden alıyor.

CreatureParam, 2 boyutlu bir dizi dizidir;

Tür, HTML yoluyla bir MYSQL veritabanından döndürülen HTML etiketiyle flaşa gönderilen bir tamsayıdır.

Mark1_cb, sahnede olan ve bir örnek adına sahip olan bir combobox'tır. Bu çıktı aynı zamanda bir tamsayıdır.

Bu kodun doğrudan altında, "BirdBodyColor_mc" sınıfı harici bir swf "ArtLibrary.swf" sınıfından içe aktarılır. BirdBodyColor_mc, bir png görüntüsünden oluşturulan bir movieclip'dir. ArtLibrary.fla'daki movieclip'i çift tıklamanız ve ikinci bir anahtar çerçeveyi eklemeniz gerektiğine dikkat edin. Movieclips'in iki kareye ihtiyacı var ya da bir sprite olarak içe aktarmak için flaş deniyor ve tür uyuşmazlığına neden oluyor.

[Yerleştir (source = "ArtLibrary.swf", symbol = "BirdBodyColor_mc")] var BirdBodyColor_mc: Class;

Normalde bu kodu kullanarak bu movieclip sınıfının bir örneğini sahneye koyardım.

myMC: MovieClip = new BirdBodyColor_mc(); addChild (myMC);

var Tanım: Sınıf = bu ["BirdBodyColor_mc"] Sınıf olarak; var Mark1: MovieClip = new Definition();

Ama bunu dizimde bakılan bir dize değeri kullanarak yapmalıyım. İşte bunun için kod.

var Tanım: Sınıf = bu [CreatureParam [Tür] [Mark1_cb + 2]] Sınıf olarak; var Mark1: MovieClip = new Definition(); "Image1Class" bir değişken adı değil, gerçek Sınıf adı çünkü

3

senin yöntem işe yaramazsa nedenidir.

Gördüğünüz olabileceğinden sınıf adını (işleve geçirilmesi gerektiğini bir) anlamına gelen bu

import flash.utils.getQualifiedClassName; 
trace(getQualifiedClassName(Image1Class)); 

gibi sınıf adını almak MyClass_Image1Class gibi bir şey olabilir.

+0

Ancak, getDefinitionByName() 'olarak, şu anki sınıfınızın _outside_ öğelerine erişiyorsanız sadece gerekli olabileceğinden, yukarıdaki yöntemlerden birini öneririm. – IQAndreas