0

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

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

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

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

谢谢。

4

2 回答 2

1

好的,使事物成为静态的基本原因是如果你想让它独立于实例,例如 as3 中的数学函数(你调用 Math.min() 而不是 var math = new Math(); math.min ()...) 这对于参考、重复计算、简单操作(x 值加 10)等很有用。

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

您需要做的是通过名称获取函数(例如,对象“函数名”有效),在数组中创建匿名函数,或者向静态函数添加回调方法,类似于以下内容:

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

总而言之,您只是增加了无济于事的复杂层。如果您只是添加一个类函数并让它们都执行相同的操作,那么与调用静态函数相比,它不会占用更多的空间或精力。您需要考虑如何以及为什么要在课程中(或在课程之外)使用该函数。

于 2010-06-07T07:03:15.343 回答
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;
}
于 2010-06-12T19:20:15.310 回答