eventDispatcher从子类到另一个类

时间:2013-02-17 18:35:02

标签: actionscript-3 air adobe dispatchevent

我一直在努力解决以下问题几个小时,如果你没有扩展那个类,你如何从另一个类调用自定义类。

我的主Base类上有一个timer事件,Base.myTimer.addEventListener(TimerEvent.TIMER,processTime) - 基类

然后我在代码Base.mytimer.removeEventListener中删除该方法(TimerEvent.TIMER,processTime。 - 基类

我有一个按钮(Btn类),当它完成处理时我想再次调用该方法,但我无法让它工作,因为该方法不存在于按钮类中而是存在于基类上所以flash显然给了我错误processTime没有定义。

例如现在我想从按钮内重新实例化事件监听器,所以我有

Base.myTimer.addEventListener(TimerEvent.TIMER,processTime); 或this.parent.parent [“myTimer”]。addEventListener()

myTimer是Base类中的静态Timer。

如果它不是自定义方法,我可以创建一个普通的dispatchEvent,例如Base.myTimer.dispatchEvent(new TimerEvent(TimerEvent.TIMER))。

到目前为止我看到的例子都没有解决我的问题。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以将对Base类实例的引用传递给Button实例。

// Button class
package {
    import Base;
    // Other imports...

    public class Button {
        public function Button(base:Base):void {
            // processTime and myTimer must be public.
            // I put this line in the constructor for brevity, but if you stored base 
            // in an instance variable, you could put this anywhere in the button 
            // class.
            Base.myTimer.addEventListener(TimerEvent.TIMER, base.processTime)
        }
    }
}

// Create button like this. 
var button:Button = new Button(base);

// Or if button is created inside of Base
var button:Button = new Button(this);

更好的方法是在Base类中创建两个方法,用于添加和删除侦听器,并将myTimer和processTime设为私有:

public class Base {
    public function addTimerListeners():void {
        myTimer.addEventListener(TimerEvent.TIMER, processTime)
    }

    public function removeTimerListeners():void {
        myTimer.removeEventListener(TimerEvent.TIMER, processTime)
    }
}

然后你可以从课外调用这两个方法。这样可以更加隐藏班级的内部运作。如果您决定将myTimer更改为实例变量而不是静态变量,则不必对Base类之外的代码进行任何更改。这称为封装,是一种很好的做法。

答案 1 :(得分:0)

看起来按钮类是Base类子树的一部分。在这种情况下,您可以在单击按钮类时执行dispatchEvent

dispatchEvent(new Event("AddListenerAgain", true));

在Base类中,您必须已经可以访问按钮类,因此您可以说:

button.addEventListener("AddListenerAgain", addListener);

然后在基类

private function addListener(e:Event) : void {
 myTimer.addEventListener(TimerEvent.TIMER, processTime);
}

在这个例子中,我已经派遣并听取了原始字符串。这不是推荐的做法。您必须阅读如何调度自定义事件才能正确执行此操作。