在AS3 / Flash CS5中全局导入类

时间:2011-12-11 05:40:42

标签: flash actionscript-3 class static flash-cs5

我在ActionScript 3,Flash Professional CS5.5和AIR 3中有一个项目。

我有几个需要访问的自定义类。目前,我通过传统方法成功访问:

import trailcrest.core.core;
var Core:core = new core();

然而,我在我的代码中实现了...这创建了类的COPY,并且不提供对原始文件的访问。这当然是一个问题 - 我需要一个符号的脚本来修改类中的变量,而另一个符号的脚本访问该变化的变量。显然,现在,情况并未发生。

我如何做我所描述的?我应该以某种方式为类创建一个“公共变量”(虽然我需要有关如何做到这一点的说明......我不能在阶段或符号中使用“public var”)?有没有办法直接访问课程?

帮助!并提前感谢。

4 个答案:

答案 0 :(得分:2)

通常认为使用全局变量是不好的做法。它通常导致代码缺乏灵活性,并且在例如引入某些更改或进行修改时容易中断。

import trailcrest.core.core;
var Core:core = new core();

这很好!

如果一个Object需要更改Core中属性的值,您只需要通过调度一个事件来告知Core更改值。

 var object:MovieClip = new MovieClip();
 object.dispatchEvent ( property );

在这种情况下,Core似乎有意义成为你的文档类,在这种情况下,它会知道你的应用程序中的所有对象,无论是作为孩子,大孩子等...

如果不是您的文档类,那么您可以......

 //In the Document Class
 var Core:core = new Core();
 var object:MovieClip = new MovieClip();

 // CoreEvent being a Custom Event
 object.addEventListener( CoreEvent.CHANGE , changeListener );
 addChild( object );

 //in another part of the Document Class
 //after a value has changed
 object.dispatchEvent ( property );

 //a method of the Document Class
 private function changeListener( event:CoreEvent ):void
 {
      var propNewValue:Object = event.property;
      //If you're using a singe instane of Core in the Document
      //Class, any other symbol can now access the new value.
      core.property = propNewValue;
 }

如果在应用程序的其他部分中创建了对象,则始终可以将Core实例作为参数传递。

  //In the Document Class
  var newobject:MovieClip = new CustomClass( core );

修改

如果您觉得这个答案令人困惑,您应该阅读有关OOP的基本原则以及AS3中的事件调度。感兴趣的东西可能是Signals library,是事件调度的一个很好的替代方案。

一般的想法是避免让你的对象绑定到Singleton或任何类型的Global变量。理论上,对象应该只知道自己,并且你会使用事件对象来自己之间进行通信。

答案 1 :(得分:2)

使用Singleton design pattern很好地完成了这项工作。 以下是AS3实施示例:

package   {

public class SomeClass {

    /** Singleton instance */
    private static var instance : SomeClass;

    /** This instance variable will be accesible globaly by calling it SomeClass.getInstance().somePublicVar */
    public var somePublicVar    : * ;

    /**
     * Get singleton instance of class
     * @return  singleton instance  SomeClass
     */
    public static function getInstance () : SomeClass {
        return SomeClass.instance ? SomeClass.instance : ( SomeClass.instance = new SomeClass() );
    }

}

}

答案 2 :(得分:2)

最好的方法是创建一个叫做“单身人士”的东西。简单地说,单例是一个静态类,没有静态类的所有讨厌的缺点。它使全局可用的单个实例(或单个副本),然后它将像常规实例一样(因为它是)。

通过使用静态变量和函数可以实现单例。静态变量/函数是的一部分,而不是实例。因此,每个变量只能有一个(只有一个类),并且它们都可以全局访问。静态函数和属性的一个很好的例子是内置的Math类。您可以像这样得到Pi的值:

Math.PI

不喜欢这样:

var math:Math = new Math();
math.PI

正如您所看到的,它是具有该方法的类。我们可以通过提供一个全局可访问的静态getInstance()函数来使用它来创建单例,该函数将始终返回相同的对象。以下是单例的示例实现:

package {

    public class SingletonSample {

        // The singleton instance
        private static sharedSingleton:SingletonSample = null;

        // The constructor. AS3 doesn't allow for private constructors
        // so we have to protect it manually
        public function SingletonSample() {
            if (sharedSingleton != null)
                throw new Error ("SingletonSample cannot be created with the new keyword. Use getInstance() instead.");
        }

        // The method that will get the actual instance
        public function getInstance():SingletonSample {
            if (sharedSingleton == null)
                sharedSingleton = new SharedSingleton();
            return sharedSingleton;
        }

    }

}

除了样本中定义的那些方法和变量之外,该类的其余部分可以正常编程。然后,当您想在代码中使用该类时,而不是这样做:

var instance:SingletonSample = new SingletonSample();
instance.doAThing(instance.aProperty);

这样做:

var instance:SingletonSample = SingletonSample.getInstance();
instance.doAThing(instance.aProperty);

实际上,当您只是快速调用方法时,根本不需要创建局部变量。做这样的事情:

SingletonSample.getInstance.aQuickFunction();

如果已导入SingletonSample类,则全局可用。这种设计模式是一个伟大的“经理”课程,因此它可能适合您的需求。但请记住,单身人士通常不适合实际操纵物体。将它们用作经理,提供对其他事物的引用,如果你愿意,可以提供一种“中间人”类。但是,如果使用得当,它们可以成为程序员工具库中强大而方便的工具。

答案 3 :(得分:1)

您可以考虑使用静态类变量,例如:

package trailcrest.core {
    import trailcrest.core.core;
    public class YourCustomClass {
        public static var coreReachableFromAnywhere:Core //THE STATIC VARIABLE FOR CORE
    }
}

然后在你的孙代码中:

import trailcrest.core.YourCustomClass;
yourCustomClass.coreReachableFromAnywhere = new Core();
yourCustomClass.coreReachableFromAnywhere.someMethod() ...

修改

当然,按照其他人的建议添加单例类型的方法可以使它更清晰,我也会对他们的答案进行投票。