AS3 class:访问未定义的方法/属性 错误

AS3 class : access of undefined method / property errors

我有这个 class :

package  {

    import flash.net.SharedObject;
    import flash.display.DisplayObject;

    public class gestioneMultilingua 
    {
        public static function settaLingua(lingua:String):void
        {
            var dati:SharedObject = SharedObject.getLocal("datiApp", "/");
            dati.data.lingua = lingua;
            dati.flush();
        }

        public static function applicaFiltriLingua():void 
        {
            var dati:SharedObject = SharedObject.getLocal("datiApp", "/");
            var lingua : String = dati.data.lingua;

            for(var i:int = 0; i<numChildren; i++){
                var e:Object = getChildAt(i);

                if(e.name.indexOf("$"+lingua) >= 0){
                    e.visible = true;
                }
                else if(e.name.indexOf("$")  >= 0){
                    e.visible = false;
                }
            }
        }
    }
}

但我遇到了这些错误:

我该如何修复它们?也许我需要导入一个包?

一个静态方法只能调用另一个静态方法。 numChildren 和 getChildAt 不是静态方法,从静态方法内部调用它们只会产生错误。即使您的 class 正在扩展 DisplayObjectContainer 它仍然会出现这些错误,因为 class 的实例将具有 getChildAt 方法和 numChildren 属性 但在静态级别它们仍然不存在并且仍然会产生错误。

不要使您的 applicaFiltriLingua 方法静态化并扩展有效的 DisplayObjectContainer

由于您的函数是 STATIC 函数,因此您永远无法实例化一个函数,并且不允许所有类型的非静态字段。也不允许使用实例构造函数,class 会自动密封。

使方法非静态并实例化 class "gestioneMultilingua"

var multilingua:gestioneMultilingua = new gestioneMultilingua();

你可以像那样访问它multilingua.applicaFiltriLingua(//参考舞台) 和 做

public function applicaFiltriLingua(stage_ref:MovieClip):void
{
    var dati:SharedObject = SharedObject.getLocal("datiApp", "/");
    var lingua : String = dati.data.lingua;

    for(var i:int = 0; i<numChildren; i++){
        var e:Object = stage_ref.getChildAt(i);
        if(e.name.indexOf("$"+lingua) >= 0){
            e.visible = true;
        }
        else if(e.name.indexOf("$")  >= 0){
            e.visible = false;
        }
    }
}

当你正确使用它时,你可以毫无问题地使用静态函数,当然,这里的问题不在于该函数是静态的(并且不使用 numChildren 或调用 getChildAt()静态函数),但它是关于你是如何做到的。

在您的情况下,您想要使用 DisplayObjectContainer 的 children,因此您可以简单地将 object 传递给 applicaFiltriLingua() 函数,如下所示:

public static function applicaFiltriLingua(container:DisplayObjectContainer):void 
{
    var dati:SharedObject = SharedObject.getLocal("datiApp","/");
    var lingua:String = dati.data.lingua;

    for (var i:int = 0; i < container.numChildren; i++) 
    {
        var e:DisplayObject = container.getChildAt(i);
        if (e.name.indexOf("$" + lingua) >= 0) {
            e.visible = true;
        } else if (e.name.indexOf("$")  >= 0) {
            e.visible = false;
        }
    }
}

然后你就可以毫无问题地调用你的函数了,例如:

import gestioneMultilingua;

gestioneMultilingua.applicaFiltriLingua(this);

希望能帮到你。