如何从ActionScript中具有相同名称的类引用Global类?

时间:2009-05-09 20:22:31

标签: flex actionscript-3

由于我无法控制的要求(不要问,这很荒谬)我需要创建一个名为'Math'的AS3类,它引用Global AS Math类。所以,例如:

package my.package
{
    public class Math
    {
        public static function pow( a:Number, b:Number ):Number {
            // How do I call the Global.as$Math#pow(..) function?
            return Math.pow(a,b);  
        }
    }
}

上面的代码显然是错误的 - 导致无限递归。我不知道怎么说我想委托给Global.as $ Math课而不是这个Math课......

我当前的尴尬解决方案是委托另一个传递给Global Math类的类(不是名为Math)。有更好的方法吗?

谢谢!

5 个答案:

答案 0 :(得分:7)

在阅读Josh Tynjala的post后,关于动作脚本中的包只是名称空间上的抽象层,这是另一种突然出现的方式:

public class Math
{
        namespace globalNs = "";  
        public static function pow( a:Number, b:Number ):Number 
        {
            return globalNs::Math.pow(a, b);  
        }

}

globalNs :: Math.pow明确引用顶级数学类。

答案 1 :(得分:2)

保存对flash播放器Math对象的静态引用,并在整个静态方法中使用它:

package test

{     import flash.utils.getDefinitionByName;

public class Math
{
        private static var _flashMath:Class = Class(getDefinitionByName("Math"));  
        public static function pow( a:Number, b:Number ):Number 
        {
            return _flashMath.pow(a, b);  
        }

}

}

答案 2 :(得分:1)

尝试使用AS3 namespace来引用AS3 Math对象。或者您的类可以简单地扩展Math对象,它将自动拥有所有Math对象的功能,而无需重写所有这些包装函数。

答案 3 :(得分:0)

作为对apphackers回复的一个小跟进,你不能简单地扩展AS3 Math对象并拥有所有它的功能,如同建议的那样。扩展对象时静态方法会丢失,因为它们静态地绑定到定义它们的对象。此外,您无法扩展具有相同名称的类。您可能在命名空间解决方案上取得了一些成功,但是我不确定它是否适用于静态方法,我有兴趣看到您的结果。

答案 4 :(得分:0)

数学是AS3中的一个特例,因为它实际上不应该是全局的,而是它。因此,就我所知,它没有名称空间。你提出的通过另一个类路由的解决方案实际上非常聪明。但是你知道真的解决方案是将类Math2或MathHelper或MathUtils命名为Math而不是Math。请告诉我你无法控制的原因是什么!不知道是杀了我!!!