Flash AS3 calling a function from a class within a

2019-09-18 02:15发布

问题:

I've been searching around trying to work this out for a while now. There's been various ideas popping up, like dispatchEvent etc but nothing that seems to be a clear, simple way of doing this.

What I'm trying to do is call a function from a class seperate (but in the same folder as) my document class. Specifically, I want to 'spawn' an object and run a function within that object's class from my Main.as. The snippet I have at the moment is as follows;

In Main.as:

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

The spawn function is a public function within class_Object but when I try and run this, I get the error: 'Error #1006: spawn is not a function' If I take out the 'object.spawn();' code it adds the object fine.

I must be missing something obvious, but can't figure out what

Thanks

EDIT

Fixed the problem, I had forgotten to specify the path to the class in the AS linkage of my Library object, thought I'd done that!

回答1:

You marked that method as static. That means that it belongs to the class itself not instances of that class.

To invoke the method as defined you would say:

class_Object.spawn()

However, this may not be what is intended, but it's difficult to say without seeing the implementation. Removing the static keyword from its definition will attach it to an instance and will be accessible the way you have described.

See here for the adobe documentation on the subject.


To answer your comment, a simple way to think about it is a "class" is a blueprint to create "instances".

So, when you say new class_Object() you telling the "blueprint" to "construct" a new instance of the blueprint. In side the blueprint you can define methods/properties that should available to the instance (or instance methods). Also, you can also define methods/properties that are available to the "blueprint" itself (or static methods).

So using the classic example of a 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.
    }
} 

Then for example:

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.

When you "extend" from another class, you are "borrowing" the functionality from another class and adding/replacing your own functionality. But as long as you have an instance, if it is a "public" method, then it will be externally available from where ever that instance is available. I don't know if that helps answer you comment.



回答2:

you need to make the method inside your class_Object public

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();