【问题标题】:Flash AS3 calling a function from a class within a seperate classFlash AS3 从单独类中的类调用函数
【发布时间】:2012-02-26 22:44:38
【问题描述】:

我一直在四处寻找,试图解决这个问题。出现了各种想法,例如 dispatchEvent 等,但似乎没有一种清晰、简单的方法可以做到这一点。

我想做的是从一个单独的类(但与我的文档类在同一个文件夹中)调用一个函数。 具体来说,我想从我的 Main.as 中“生成”一个对象并在该对象的类中运行一个函数。 我现在的sn-p如下;

在 Main.as 中:

var object:class_Object = new class_Object();
object.spawn();
addChild(object);

spawn 函数是 class_Object 中的一个公共函数,但是当我尝试运行它时,我收到错误:“错误 #1006:spawn 不是函数” 如果我取出 'object.spawn();'代码它可以很好地添加对象。

我一定遗漏了一些明显的东西,但不知道是什么

谢谢

编辑

解决了这个问题,我忘记在我的库对象的 AS 链接中指定类的路径,以为我已经做到了!

【问题讨论】:

    标签: flash actionscript-3 class function


    【解决方案1】:

    您将该方法标记为static。这意味着它属于 class 本身而不是该类的 instances

    要调用定义的方法,你会说:

    class_Object.spawn()

    但是,这可能不是预期的,但是如果没有看到实现就很难说。从其定义中删除 static 关键字会将其附加到 instance 并且可以按照您描述的方式访问。

    有关该主题的 adobe 文档,请参阅 here


    要回答您的评论,一种简单的思考方式是“类”是创建“实例”的蓝图。

    所以,当您说new class_Object() 时,您是在告诉“蓝图”“构建”蓝图的一个新实例。在蓝图中,您可以定义实例(或实例方法)应该可用的方法/属性。此外,您还可以定义“蓝图”本身(或静态方法)可用的方法/属性。

    所以使用Car的经典示例

    public class Car {
    
        public function startEngine():void {
            // This is an instance method, it will be available to
            // any instance of a car, or new Car();
    
            // Note: "this" in this context refers to the current instance of the car
            // that the method is being called from
        }
    
        public static function compare(Car car1, Car car2):bool {
            // This method belongs to the blueprint of a car
    
            // Note: "this" doesn't make any sense in this context, because we 
            // aren't talking about a particular instance.
        }
    } 
    

    那么例如:

    var mercedes:Car = new Car();
    var bmw:Car = new Car();
    
    mercedes.startEngine(); // call an instance method. notice we call it from a particular instance of a car.
    Car.compare(mercedes, bmw); // call an static method. notice we call it from the class of Car.
    

    当您从另一个类“扩展”时,您是在从另一个类“借用”功能并添加/替换您自己的功能。但是,只要您有一个实例,如果它是一个“公共”方法,那么它就可以从该实例可用的任何地方从外部可用。我不知道这是否有助于回答您的评论。

    【讨论】:

    • 哦,我明白了,我没有意识到静态将它纯粹附加到班级,感谢您澄清这一点。但是,如果我理解正确的话,它们是两个单独的类,而不是一个类的实例。所以我有扩展MovieClip 的Main 类和扩展Sprite 的Object 类。这仅在主文件扩展目标文件时才有效?感谢您的帮助!
    • 这绝对有帮助,我现在对课程有了更好的理解,所以谢谢!但是,我像上面那样启动并调用我的对象类的一个实例,并像上面那样从它调用一个方法,但它会引发错误。我不确定我设置变量并从 Enter_Frame 函数中调用该方法是否重要,不应该这样做。哦,如果我像您一样尝试调用静态方法,则会收到错误消息:'1061: Call to possible undefined method 'method' through an reference with static type Class' 非常感谢您的耐心等待!
    • /facepalm!伙计,我是个白痴。在链接到我的类的库对象上,我没有指定路径(com.X.Y.class),所以它变得非常混乱。现在一切正常,很抱歉浪费您的时间!
    【解决方案2】:

    您需要将 class_Object 中的方法公开

    package my.package{
        public class class_Object(){
             public function class_Object(){
                 //constructor 
             }
    
             public function spawn():void{
                   //spawn code
             }
    
        }
    }
    
    
    
    var classObject:class_Object = new class_Object();
    classObject.spawn();
    

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 2012-05-13
      相关资源
      最近更新 更多