代码之家  ›  专栏  ›  技术社区  ›  tyler

如何从ActionScript中同名的类引用全局类?

  •  0
  • tyler  · 技术社区  · 17 年前

    由于需求超出了我的控制范围(不要问,这很荒谬),我需要创建一个名为“Math”的AS3类,该类引用全局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);  
            }
        }
    }
    

    上面的代码显然是错误的——导致无限递归。我不知道该怎么说我想把权力下放给全球委员会。作为一门数学课而不是这门数学课。。。

    我目前尴尬的解决方案是委托给另一个类(未命名为Math),该类将传递给全局数学类。有更好的方法吗?

    谢谢

    5 回复  |  直到 17 年前
        1
  •  7
  •   akurtser    17 年前

    在读了乔希·廷贾拉的书后,我想到了另一种方式 post 关于actionscript中的包如何只是名称空间上的抽象层:

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

    全球:数学。pow明确指的是顶级数学课程。

        2
  •  2
  •   akurtser    17 年前

    保存对flash player数学对象的静态引用,并在整个静态方法中使用它:

    package test
    

    { 导入flash。乌提尔斯。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);  
            }
    
    }
    

    }

        3
  •  1
  •   Bjorn    17 年前

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

        4
  •  0
  •   Tyler Egeto    17 年前

    作为apphackers回复的一小部分后续内容,您不能简单地扩展AS3 Math对象,并拥有它所建议的所有功能。静态方法在扩展对象时丢失,因为它们静态地绑定到定义它们的对象。此外,不能使用相同的名称扩展类。不过,使用名称空间解决方案可能会取得一些成功,尽管我不确定它是否适用于静态方法,但我很想看看您的结果。

        5
  •  0
  •   Iain    17 年前

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

    推荐文章