由于我无法控制的要求(不要问,这很荒谬)我需要创建一个名为'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)。有更好的方法吗?
谢谢!
答案 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。请告诉我你无法控制的原因是什么!不知道是杀了我!!!