试图找出为什么我可以从这个类的实例化版本中调用此函数。
我得到的错误是:
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;
}
}
}
答案 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),很难说出最适合您情况的部分。