2011-09-17 7 views
0

특별한 클래스 이름에 따라 모든 인스턴스를 가져와야합니다. 나는이 일을하고있다 :AS3에서 클래스 이름으로 인스턴스 가져 오기

var class_ref:Class = getDefinitionByName('fran.MyOwnClass') as Class; 
var element; 

for (var i:uint = 0; i < this.parent.numChildren; i++) 
{ 
    element = this.parent.getChildAt(i); 
    if (element is class_ref) 
    { 
     trace('Found element of class fran.MyOwnClass'); 
    } 
} 

나는 더 좋은 방법을 원한다. 가능한가?

+0

내가 올바른 클래스인지 다른 방법으로 생각할 수는 있지만 루프를 피할 수는 없다고 생각합니다. 아마도 당신이 컨테이너의'addChild()'를 오버라이드한다면, 거기에서 체크를 할 수있을 것입니다. – RIAstar

+0

@RIAstar 무시는 요소를 찾았을 때 내가 아래에서 말한 내용을 확인해야하기 때문에 원하는 내용이 아닙니다. 또는 당신이 말한 것을 이해하지 못했습니다 (저는 이미 AS3에서 매우 초보자입니다). –

답변

1

당신이 응용 프로그램의 삶의 처음부터 인스턴스를 추적을 시작 할 수 있다면, 나는 단순히 권 해드립니다 이벤트 리스너 추가 : 당신이 할 수있는 경우

// in document class constructor, before doing anything else 
stage.addEventListener(Event.ADDED, stage_addedHandler); 
stage.addEventListener(Event.REMOVED, stage_removedHandler); 

private function stage_addedHandler(event:Event):void 
{ 
    var obj:DisplayObject = event.target as DisplayObject; 
    // do something, e.g. if (obj is MyClass) objCounter++; 
} 
... 

를 ' t 트랙을 처음부터 반복하면 루프를 피할 수 없습니다 .. 더 최적화 된 상태로 만드십시오.

var n:int = container.numChildren; 
while (n-- > 0) 
{ 
    ... 
} 

어디서든 addChild()와 다른 것들을 오버라이드합니다 - 그건 실제 프로젝트에서 단순히 불가능한 해결책입니다.

+0

당신은 절대적으로 옳습니다. 내 마음은 어딨어? – RIAstar

0

당신은 컨테이너 클래스를 확장하고 addChild(), addChildAt(), removeChild()removeChildAt() 기능을 재정 의하여 모든 MC의 특정 유형의 목록을 유지할 수 있습니다. 이 클래스, 아이가 추가 될 때마다 사용

public class MySprite extends Sprite { 

    public var ownClasses:Vector.<MyOwnClass> = new Vector.<MyOwnClass>(); 

    override public function addChild(child:DisplayObject):DisplayObject { 
     addOwnClass(child as MyOwnClass); 
     return super.addChild(child); 
    } 

    override public function addChildAt(child:DisplayObject, index:int):DisplayObject { 
     addOwnClass(child as MyOwnClass); 
     return super.addChildAt(child, index); 
    } 

    private function addOwnClass(child:MyOwnClass):void { 
     if (child) ownClasses.push(child); 
    } 

    override public function removeChild(child:DisplayObject):DisplayObject { 
     removeOwnClass(child as MyOwnClass); 
     return super.removeChild(child); 
    } 

    override public function removeChildAt(index:int):DisplayObject { 
     removeOwnClass(getChildAt(index) as MyOwnClass); 
     return super.removeChildAt(index); 
    } 

    private function removeOwnClass(child:MyOwnClass):void { 
     if (child) { 
      var i:int = ownClasses.indexOf(child); 
      if (i != -1) ownClasses.splice(i, 1); 
     } 
    } 

} 

, 당신은이 MyOwnClass을인지 확인하고 있는지 당신은 ownClasses 목록에 추가합니다. 자식 제거와 비슷합니다.

이제 MC를 반복하지 않고도 필요할 때 목록에 액세스 할 수 있습니다.

public class Main extends MySprite 
{ 
    public function Main() 
    { 
     addChild(new Sprite()); 
     addChild(new MyOwnClass()); 
     trace(ownClasses); 
    } 
} 

이 뜻을 출력 [object MyOwnClass]

관련 문제