Actionscript3 / LCCS:如何访问属性父类受保护的var?

时间:2011-08-19 04:02:36

标签: flex actionscript-3 oop inheritance actionscript

我想将一个事件监听器分配给父类中的受保护的定时器变量。

我正在使用Adobe LCCS,并创建了BatonProperty 实现Baton

现在,Baton有一个像这样声明的受保护的计时器变量,由于某种原因,我无法从BatonProperty实例访问这个_autoPutDownTimer。

  public function Baton()
          {
              super();

              _autoPutDownTimer = new Timer(_timeout*1000, 1);
              _autoPutDownTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
              invalidator.addEventListener(Invalidator.INVALIDATION_COMPLETE,commitP roperties);
          }

我很乐意像这样附上一个eventlistener,但似乎我不能,任何提示真的很感激:

    public var mybatonprop:BatonProperty;
    mybatonprop= new BatonProperty();
    mybatonprop.sharedID = "myBaton";
    mybatonprop.subscribe();

    mybatonprop.baton._autoPutDownTimer.addEventListener(TimerEvent.TIMER,countDown);   

这给出了错误:“actionscript尝试通过带有静态类型的引用来访问不可访问的属性”但似乎属性不是私有的,只是受保护的,因为它被声明为这样

    /**
     * @private
     */
    protected var _autoPutDownTimer:Timer;

2 个答案:

答案 0 :(得分:2)

protected表示私有,除了该类的后代。即从父级继承的类。看起来你的BatonProperty通过合成使用Baton,而不是继承。而且,据我所知,您似乎正试图通过第三类从Baton / BatonProperty访问_autoPutDownTimer。

我的建议虽然不是将事件监听器直接添加到计时器,而是从Baton函数中的onTimerComplete发送事件

protected function onTimerComplete(event:TimerEvent):void {
    ....
    dispatchEvent(new Event('putDownComplete'));
}

mybatonprop.baton.addEventListener('putDownComplete', onPutdownComplete);

答案 1 :(得分:2)

如果BatonProperty延长Baton,则只需更改以下行:

mybatonprop.baton._autoPutDownTimer.addEventListener(TimerEvent.TIMER,countDown);

mybatonprop._autoPutDownTimer.addEventListener(TimerEvent.TIMER,countDown);

否则,将_autoPutDownTimer公开,或按照@ Jacob的回答。

或者对于第三个建议,因为Baton是一个Adobe类,你无法编辑它,创建自己的类MyBaton,扩展Baton,然后执行其中任何一个建议。 (MyBaton将在Baton到处都有效)