我一直在努力解决以下问题几个小时,如果你没有扩展那个类,你如何从另一个类调用自定义类。
我的主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))。
到目前为止我看到的例子都没有解决我的问题。任何帮助,将不胜感激。
答案 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);
}
在这个例子中,我已经派遣并听取了原始字符串。这不是推荐的做法。您必须阅读如何调度自定义事件才能正确执行此操作。