Получить составной класс MovieClip, содержащий (родительский) после события

У меня есть MovieClip, который состоит из родительского (не отображаемого объекта) класса. Мы регистрируем прослушиватель событий для этого клипа — например, обработчик CLICK.

С помощью event.target я могу получить ссылку на MovieClip из обработчика событий. Но как я могу получить ссылку на составной класс?

Я мог бы просто добавить свойство «parentClass» в динамический класс MovieClip, но мне интересно, есть ли более элегантный/идиоматический способ сделать это, который я должен рассмотреть?


person Tom Auger    schedule 13.08.2011    source источник


Ответы (2)


Если класс, который создает ваш MovieClip, не является объектом отображения, то он не может считаться его родителем. Родительским элементом будет тот, к которому прикреплен ваш MovieClip. Все, что содержит создающий класс, — это ссылка на объект, точно так же, как если бы вы затем ссылались на MovieClip в другом месте.

Я бы предпочел создать класс-потомок MovieClip, который может содержать ссылку на создающий класс, который вы затем будете использовать вместо MovieClip.

package {
    import flash.display.MovieClip;

    public class MovieClipWithRef extends MovieClip
    {
        private var _parentRef:Object;  //obviously cast this as accurately as possible

        public function MovieClipWithRef($ref:Object):void
        {
            _parentRef = $ref;
        }

        public function get parentRef():Object
        {
            return _parentRef;
        }
        //no setter makes this property read-only once set by the constructor
    }
}
person shanethehat    schedule 13.08.2011
comment
Спасибо! А что, если MC — это клип во время разработки, который уже находится на сцене? Это что-то меняет? - person Tom Auger; 23.08.2011
comment
Если это просто мувиклип на сцене, вы можете использовать parent, чтобы найти его первого предка дерева отображения. Это то, что вы имели ввиду? - person shanethehat; 23.08.2011
comment
Нет, я имел в виду, я все еще составлял его в классе неэкранных объектов, но только после того, как он был найден на сцене после ADDED_TO_STAGE. Я полагаю, вы просто использовали его как MovieClipWithRef и продолжили свой веселый путь? - person Tom Auger; 23.08.2011
comment
Нет, если он уже существует на сцене как мувиклип, то его приведение не установит ссылку на родительский объект, поскольку он уже определен как мувиклип. - person shanethehat; 23.08.2011

Этот ответ по сути такой же, как ответ shanethehat, но также включает в себя составной шаблон проектирования. Посмотрите на следующий пример:

ICompositeObject.as:

package com.flashdevelopprojects.patterns.composite
{
    public interface ICompositeObject 
    {
        function get parentObject():Object

    }// end interface

}// end package

СоставнойОбъект.as:

package com.flashdevelopprojects.patterns.composite
{
    public class CompositeObject implements ICompositeObject
    {
        private var _parentObject:Object;

        public function get parentObject():Object { return _parentObject }

        public function CompositeObject(parentObject:Object) 
        {
            _parentObject = parentObject;

        }// end function

    }// end class

}// end package

Main.as(класс документа):

package 
{
    import com.flashdevelopprojects.patterns.composite.CompositeObject;
    import com.flashdevelopprojects.patterns.composite.ICompositeObject;
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var a:A = new A();
            a.b.addEventListener(Event.ADDED_TO_STAGE, onBAddedToStage);
            addChild(a.b);

        }// end function

        public function onBAddedToStage(e:Event):void
        {
            var b:ICompositeObject = ICompositeObject(e.target);

            trace(b.parentObject); // output: A

        }// end function


    }// end class

}// end package

import com.flashdevelopprojects.patterns.composite.CompositeObject;
import com.flashdevelopprojects.patterns.composite.ICompositeObject;
import flash.display.MovieClip;

internal class A
{
    private var _b:B;

    public function get b():B { return _b }

    public function A()
    {
        _b = new B(this);

    }// end function

    public function toString():String { return "A" }

}// end class

internal class B extends MovieClip implements ICompositeObject
{
    private var _compositeObject:CompositeObject;

    public function get parentObject():Object { return _compositeObject.parentObject }

    public function B(parentObject:Object)
    {
        _compositeObject = new CompositeObject(parentObject);

    }// end function

}// end class
person Taurayi    schedule 13.08.2011