【问题标题】:add method to as3 class将方法添加到 as3 类
【发布时间】:2011-07-28 07:28:03
【问题描述】:

as3中有一个Point(flash.geom.Point)类 我想向 Point 类添加方法(例如 convertToStagePointMyMethod()),我想通过使用来调用此方法

var a:Point=new Point();
a.convertToStagePointMyMethod()

我应该怎么做才能将此方法添加到类 Point?是否可以不继承。我想像 .NET 中的“部分”类一样使用它

【问题讨论】:

    标签: flash actionscript-3 actionscript


    【解决方案1】:

    我通常不会扩展一个类,而是创建独立的实用函数,如下所示:

    package com.example.utils
    {
        public function doSomethingToPoint(p:Point):void
        {
            //do something
        }
    }
    

    将它放在一个名为 doSomethingToPoint.as 的文件中,然后就可以开始了。它就像flash.net.navigateToURL 这样的内置包级函数一样工作。直接导入使用即可。

    import com.example.utils.doSomethingToPoint;
    
    var p:Point = new Point();
    doSomethingToPoint(p)
    

    或者,您可以创建一个具有多个相关静态函数的实用程序类,如下所示:

    package com.example.utils
    {
        public class PointUtil
        {
            public static function doSomethingToPoint(p:Point):void
            {
                //do something
            }
    
            //other functions here
        }
    }
    

    你会像这样使用这个类和它的函数:

    import com.example.utils.PointUtil;
    
    PointUtil.doSomethingToPoint(p);
    

    就我个人而言,我更喜欢创建独立的函数,这样我的项目就不需要编译额外的静态函数,这些函数实际上并没有在任何地方使用,但每个人都有自己的偏好。

    【讨论】:

    • 你的第二个例子是我通常如何在一个更大的项目中做这种事情(当我知道它会被使用时:-)
    【解决方案2】:

    制作自己的点类

    package 
    {
        import flash.geom.Point;
    
        /**
         * ...
         * @author Jesse Nicholson
         */
    
        public class MyPoint extends Point 
        {
            public function MyPoint(positionX:Number, positionY:Number) {
                //Pass the constructor args to the super class, the Point class since it requires these params in it's constructor
                super(positionX, positionY);
            }
    
            public function convertToStagePointMyMethod():Number {
                //Do my calculations here
                var someNumber:Number = 10;
                return someNumer;
    
                //OR return a Point OR do whatever the hell you want here, you're the boss of your own point class
            }
        }
    
    }
    

    这只是你做事的方式。当您有一个想要使用但只是添加的现有类时,将其扩展为一个新类并执行此操作。这是面向对象编程的基本思想和“最佳实践”方法。

    【讨论】:

      【解决方案3】:

      除了使用 OXMO456 的非常酷的示例(以前从未见过,非常酷)之外,您还需要使用继承或组合。如果类是像 MovieClip 类或 URLVariables 类这样的“动态”类,您无需担心,但 Point 不是动态的。

      您可以通过以下方式制作自己的动态类:

      dynamic public class MyClass {...}

      【讨论】:

        【解决方案4】:

        这是一个使用 prototype 的简单示例:

        Point.prototype.foo = function (arg:String):void{
            trace("foo called");//foo called
            trace("arg",arg);//this is a test
            trace("x",this.x);//7
            trace("y",this.y);//54
        };
        
        var p:Point = new Point(7,54);
        p["foo"]("this is a test");
        

        这是不扩展类的唯一方法。 另请注意,如果您尝试使用p.foo("test"),编译器将不会在严格模式下编译,这就是我在示例中写p["foo"]("test") 的原因。

        【讨论】:

        • 是的,我记得......过去的美好时光......但我从未真正意识到可以更改非动态类的原型,然后通过关联数组样式语法访问 -非常有意义,因为原型只是一个对象。很酷...
        • 我对使用原型的感觉很复杂......我觉得要走的路是使用继承或组合。
        • 我和 goliatone 合作。整个原型风格的 OOP 系统是对旧版本 ActionScript 的回归,我个人不会让任何人在我公司的一个 AS3 客户端中使用这种技术。当然,您可以将 Point 子类化,但您也可以使用对 Point 进行操作的静态函数将实用程序类添加到项目中。我更喜欢原型路线。顺便说一句,尽管我很喜欢 Moock 书作为参考,但我会在书的末尾隐藏第 15 章,并将其命名为“如何不编写 AS3”或“类型检查被高估”
        • @goliatone @AdamSmith 同意你们的观点!
        • 是的,这很糟糕,这是旧的 AS2 尝试伪 OOP 的方式,但它实际上是反向操作。如果我没记错的话,在虚拟机中处理类的实例之前,原型也不会实现。
        猜你喜欢
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        相关资源
        最近更新 更多