错误:通过带有静态类型com.framework.model的引用调用可能未定义的方法getRegionNameForCountries:CountryModel

时间:2015-01-27 22:27:28

标签: actionscript-3 flash flex actionscript

试图找出为什么我可以从这个类的实例化版本中调用此函数。

我得到的错误是:

Error: Call to a possibly undefined method getRegionNameForCountries through a reference with static type com.framework.model:CountryModel.

错误来自此代码:

public static function territoriesFunction( item:Object, column:DataGridColumn ):String
            {
                return RemoteModelLocator.getInstance().appModel.countryModel.getRegionNameForCountries( item.countriesAvailable ) + ' ('+ item.countriesAvailable.length.toString() + ')';
            }

我试图从这里调用函数的类是:

package com.framework.model
{
    import com.adobe.cairngorm.vo.IValueObject;
    import com.adobe.crypto.MD5;
    import com.vo.RegionVO;

    import flash.utils.ByteArray;

    import mx.utils.ObjectUtil;

    public class CountryModel implements IValueObject
    {

            public static function getCountriesForRegion( regionName:String ):Array
            {
                    try
                    {
                            var result:Array = _dataModel[regionName];
                    }
                    catch(e:Error){}

                    result =  ( result )? result: _dataModel[CountryModel.WORLDWIDE];

                    return ObjectUtil.copy( result ) as Array;
            }


            public static function getRegionNameForCountries( countries:Array ):String
            {

                    if( !countries || !countries.length )
                    {
                            return CountryModel.WORLDWIDE;
                    }


                    countries.sortOn("name");


                    var buffer:ByteArray = new ByteArray();
                            buffer.writeObject(countries);
                            buffer.position = 0;


                    var hash:String = MD5.hashBytes( buffer );

                    try
                    {
                            var regionName:String = _dataModel[hash];
                            return ( regionName && regionName.length )? regionName : CountryModel.CUSTOM;
                    }
                    catch( e:Error )
                    {

                    }

                    return CountryModel.CUSTOM;
            }
    }
}

1 个答案:

答案 0 :(得分:0)

您只能从Class对象本身(例如MyClass.method())或类声明(静态或实例化)中访问静态变量/方法。

这是一个简化的例子:

MyClass.staticFunction(); //allowed

var myInstance = new MyClass();
myInstance.staticFunction(); //NOT allowed

//inside the MyClass.as
this.staticFunctionInSameClass(); //allowed

您要做的是从引用该类的实例化对象访问静态方法。

要保持与当前相同的结构,您需要在类中创建非静态辅助方法:

//CountryModel class
public function getRegionNameForCountriesHelper(countries:Array):String
{
    return getRegionNameForCountries(countries); //calls the static method
}

或者只是在类本身上访问它。

return CountryModel.getRegionNameForCountries(item.countriesAvailable, ....);

如果提前不知道Class,则可以通过将实例强制转换为Object,然后访问返回constructor的引用的Class属性来实现。< / p>

return (Object(RemoteModelLocator.getInstance().appModel.countryModel).constructor).getRegionNameForCountries(item.countriesAvailable, ...);

但这种方式非常混乱,没有编译时检查。

我建议要么只使用静态类(不允许实例化),要么不要在其中使用静态方法。如果不知道应用程序的所有部分(例如RemoveModelLocator,appModel),很难说出最适合您情况的部分。