0

我已经为以下问题苦苦挣扎了几个小时,例如,如果您不扩展该类,如何从另一个类调用自定义类。

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

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

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

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

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

myTimer 是 Base 类中的静态 Timer。

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

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

4

2 回答 2

0

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

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

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

button.addEventListener("AddListenerAgain", addListener);

然后在 Base 类中

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

在此示例中,我已调度并侦听原始字符串。这不是推荐的做法。您必须阅读如何调度自定义事件才能正确执行。

于 2013-02-18T08:17:59.577 回答
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 类之外的代码进行任何更改。这称为封装,是一种很好的做法。

于 2013-02-17T19:49:42.093 回答