AS3覆盖公共功能都叫做?

时间:2011-06-16 09:26:48

标签: actionscript-3 oop

我对这个概念感到有些困惑。

如果我覆盖基类中的公共函数,我会认为调用此覆盖函数并忽略原始函数?虽然情况似乎并非如此......

public class AbstractScreen extends Sprite
{

    public function AbstractScreen() 
    {

    }


    public function updateLanguage():void
    {
        trace("WARNING: need to override public function updateLanguage()");
    }
}

public class Start extends AbstractScreen
{
    override public function updateLanguage():void
    {
        title.text = _model.language.start
        title.setTextFormat(titleFormat);
    }
}

public class ViewManager extends Sprite
{
    private var _model:Model;
    private var _screens:Array;


    public function ViewManager(model:Model) 
    {
        _model = model;

        _model.addEventListener(AppEvent.INIT_VIEW, initViews);
        _model.addEventListener(AppEvent.UPDATE_VIEW, updateView);
        _model.addEventListener(AppEvent.CHANGED_LANGUAGE, changeLanguage);
    }

    private function initViews(e:AppEvent):void
    {
        trace("View Manager: initViews");
        _screens = new Array(new Start(_model), new TakePhoto(_model));
        dispatchEvent(new ViewEvent(ViewEvent.VIEW_READY));
    }

    private function changeLanguage(e:AppEvent):void
    {
        for each (var screen:AbstractScreen in _screens)
        {
            screen.updateLanguage();
        }
    }
}

如果我的模型调度了一个CHANGED_LANGUAGE事件,那么视图中的文本会更新,但我也会得到一条“警告:需要覆盖公共函数updateLanguage()”我可能做错了什么?

1 个答案:

答案 0 :(得分:3)

你是对的,这不应该调用基类函数。你确定没有电话

super.initLanguage()

在你的覆盖范围内?

大多数IDE会自动在函数体中添加此调用,如果它们为您创建覆盖。

修改

在您的编辑中,我看到您正在迭代两个StartTakePhoto类型的对象。我假设TakePhoto也来自AbstractScreen,并且跟踪可能来自这个。

我还建议在迭代中使用抽象基类。

for each (var screen:AbstractScreen in _screens)
{
    screen.updateLanguage();
}