从昨天开始,我一直在尝试将 ActionScript Mobile 项目从 Flash Builder 4.6 移植到 Flash Builder 4.7,但我遇到了一个可能是编译器错误的问题。在 FB 4.6 中,这有效:
温度:
package
{
import flash.display.Sprite;
public class Temp extends Sprite
{
public function Temp()
{
new StartMenu();
}
}
}
package
{
import flash.display.*;
internal class Screen1 extends Sprite
{
private static var m_vScreens:Vector.<Screen1> = new Vector.<Screen1>();
public function Screen1()
{
m_vScreens.push(this);
onScreenSizeDetermined();return;
var strFunction:String = "useSmallPortraitLayout";
for each (var screen:Screen1 in m_vScreens)
{
trace(1)
screen[strFunction]();
}
}
protected function useSmallPortraitLayout():void
{
}
private static function onScreenSizeDetermined():void
{
var strFunction:String = "useSmallPortraitLayout";
for each (var screen:Screen1 in m_vScreens)
{
trace(2)
screen[strFunction](); // Error thrown here in 4.7.
}
}
}
}
package
{
public final class StartMenu extends Screen1
{
override protected function useSmallPortraitLayout():void
{
}
}
}
ReferenceError: Error #1069: Property useSmallPortraitLayout not found on StartMenu and
there is no default value.
onScreenSizeDetermined();return;
,从而使用成员函数调用useSmallPortraitLayout()
,而不是静态函数。这不需要使用构造函数;它工作得很好,只要 Screen1
正在调用useSmallPortraitLayout()
来自几乎任何非静态方法。 useSmallPortraitLayout
,则代码将无法在 FB 4.7 中编译。这边走:screen.useSmallPortraitLayout();
Vector.<Screen1>
与 Vector.<Function>
,然后只调用函数向量的成员,而不是调用 Screen1
成员的函数向量。 (这是从生产代码简化的。)但这只是一个后备。最佳答案
这更像是一个范围问题。 protected 方法只能在实例范围内调用,而不能在静态范围内调用。当然,将修饰符更改为 public 可以解决这里的问题。 PO 可能会争辩说,这里需要 protected ,但实际上,如果打算在该实例范围之外的实例上直接调用方法,那么从逻辑上讲,该方法需要是公共(public)的。
顺便说一句,FB 4.6 编译器由使用的 AIR/FLEX SDK 提供,因此与使用相同 SDK 的 FB 4.7 的行为不会有所不同。
关于actionscript-3 - 如果使用 Flash Builder 4.7 而不是 4.6,则基类中的静态函数不想调用子类上的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28436110/