从AS3中的静态函数访问非静态函数时遇到问题

时间:2010-06-05 14:34:46

标签: actionscript-3 actionscript static non-static

我有一个类,其中包含一个下拉菜单。为了节省空间,并且由于菜单的内容永远不会改变,我为整个类创建了一个静态DataProvider,用于填充每个实例菜单。我希望用这样的实际函数填充列表:

tmpArr.push({label:"Details...", funct:openDetailsMenu, args:""});

然后将tmpArr分配给DataProvider。因为DataProvider是静态的,所以包含该代码的函数也需要是静态的,但是数组中的函数是非静态的。起初它似乎不是一个问题,因为当用户点击菜单项时,下拉菜单可以在其父项上调用非静态“executeFunction(funct,args)”。但是,当我尝试编译时,设置DataProvider的静态函数无法找到传递的非静态函数。如果编译器只相信我,代码就可以正常工作!

简单的解决方案是只传递字符串并使用switch语句来调用基于此的函数,但这很大,很丑,不优雅且难以维护,特别是如果某些东西继承自此类。 更简单的解决方案是让DataProvider非静态,但我想知道是否有其他人有一个很好的方法来解决这个问题?让静态函数能够看到它的非静态兄弟吗?

感谢。

2 个答案:

答案 0 :(得分:1)

好吧,使事物变得静态的基本原因是你想让它独立于一个实例,例如as3中的Math函数(你调用Math.min()而不是var math = new Math(); math.min()...)这对于参考,重复计算,简单操作(将x加10)等非常有用。

组合静态和非静态功能的问题在于,当调用静态函数时,该类可能在该点没有实例,或者(在这种情况下)存在对该函数的任何引用在编译中有意义(如果一个单独的类称为函数,它将如何引用openDetailsMenu?)。

你需要做的是通过名称获取函数(例如对象“functionname”),在数组中创建匿名函数,或者在静态函数中添加一个类似于此的回调方法:

public static function doAction(object:Menu, event:String){
    if(event == "details") object.openDetailsMenu() ;
}

总而言之,你只是添加了一些不太有用的复杂性。如果您只是添加一个类函数并让它们全部执行相同的操作,那么与调用静态函数相比,它不会占用更多空间或精力。你需要考虑如何以及为什么要在该类中使用该函数。

答案 1 :(得分:0)

您可以只存储对实例的静态引用,在本例中为_instance。 (有点像贫民窟单身人士)注意不要在实例化类之前调用​​静态方法。

/// in your constructor define a static reference handle to the instance
public function ClassName(){
   _instance = this;
}

public static function doSomethingStatic(){
   var varValue = ClassName._instance.someInstanceVariable;
}