2011-07-01更新:smithfox提醒,这个BUG在Flex SDK4.5/Flash Player 10.3中已经解决(不知道是从什么时候解决的,只能把我发现时候的版本贴出来),Adobe解决的办法也比较BT,就是不带括号调用方法名,不会执行方法。这样的话,以前偷懒的代码都要改过了。


A类需要调用B类中的showInfo方法,使用setShowInfo方法将被调用的方法保存在A类的 _showInfo 变量中,然后在调用该方法的时候判断该方法是否被设置,如果被设置就调用它。代码如下:

1
2
3
4
5
6
7
8
9
10
11
private var _showInfo:Function;
public function setShowInfo($showInfo:Function):void
{
_showInfo = $showInfo;
}
protected function showInfo($msg:String):void
{
trace('_showInfo is not null:', _showInfo != null);
if(_showInfo != null)
_showInfo($msg);
}

但这个代码有很大的问题,trace出来的内容居然是:

_showInfo is not null:false

想了想也对,因为 _showInfo 是方法,对方法进行调用(即使不带括号也可以调用),方法是有返回值的,而这个方法的并没有设定返回值(设定为void),也就是说返回值为空,这样就导致了即使_showInfo被设置, _showInfo != null 表达式也会返回空。

至于解决办法,也很简单(setShowInfo就省略了):

1
2
3
4
5
6
7
private var _showInfo:Function;
protected function showInfo($msg:String):void
{
trace('_showInfo is Function:', _showInfo is Function);
if(_showInfo is Function)
_showInfo($msg);
}

留言

2010-11-09
次访问