Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在AS3/Flash CS5中全局导入类_Flash_Actionscript 3_Class_Static_Flash Cs5 - Fatal编程技术网

在AS3/Flash CS5中全局导入类

在AS3/Flash CS5中全局导入类,flash,actionscript-3,class,static,flash-cs5,Flash,Actionscript 3,Class,Static,Flash Cs5,我在ActionScript 3、Flash Professional CS5.5和AIR 3中有一个项目 我有几个需要访问的自定义类。目前,我正在通过传统方法成功访问: import trailcrest.core.core; var Core:core = new core(); 然而,我在代码中实现了……这创建了类的一个副本,而不授予对原始类的访问权。这当然是一个问题——我需要一个符号的脚本来修改类中的变量,而另一个符号的脚本则访问该变量。显然,现在,这并没有发生 我如何做我所描述的?我

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

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

import trailcrest.core.core;
var Core:core = new core();
然而,我在代码中实现了……这创建了类的一个副本,而不授予对原始类的访问权。这当然是一个问题——我需要一个符号的脚本来修改类中的变量,而另一个符号的脚本则访问该变量。显然,现在,这并没有发生

我如何做我所描述的?我是否应该为类创建一个公共var,尽管我需要关于如何创建的说明……我不能在阶段或符号中使用公共var?是否有直接访问该类的方法


救命啊!提前感谢。

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

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() ...
编辑


当然,如其他人所建议的那样添加单例类型的方法会使它更干净,我也会投票支持他们的答案。

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

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

如果某个对象需要更改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中的事件调度。有趣的事情可能是事件调度,一个很好的替代方案


一般的想法是避免将对象绑定到单例或任何类型的全局变量。从理论上讲,一个对象应该只知道它自己,你可以使用事件让对象在它们之间进行通信。

这可以通过使用来很好地实现。 下面是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() );
    }

}

}最好的方法是创建一个称为singleton的东西。很简单,singleton是一个静态类,没有静态类的所有讨厌的缺点。它使单个实例或单个副本在全局范围内可用,这将与常规实例完全相同,因为它是

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

Math.PI
var math:Math = new Math();
math.PI
SingletonSample.getInstance.aQuickFunction();
不是这样的:

Math.PI
var math:Math = new Math();
math.PI
SingletonSample.getInstance.aQuickFunction();
正如您所看到的,是类具有该方法。我们可以通过提供一个静态getInstance函数来创建一个单例,该函数将是全局可访问的,并且总是返回相同的对象。下面是singleton的一个示例实现:

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);
事实上,当您只是快速调用方法时,根本不需要创建局部变量。就这样做吧:

Math.PI
var math:Math = new Math();
math.PI
SingletonSample.getInstance.aQuickFunction();

如果已导入SingletonSample类,则所有这些都是全局可用的。这个设计模式是一个很好的管理类,所以它可能会适合您的需要。但是请记住,单例通常不适合作为可操纵的对象。如果你愿意的话,可以把他们当作经理,为其他事情提供参考,一种中间人阶层。但是,如果使用得当,它们可以成为程序员武库中一个强大而方便的工具。

现在,这将出现在document类中吗?另外,这是否允许我修改core中的变量?假设我正确地阅读了您的问题,如果您只需将变量更改为公共静态varbialbeName,您应该能够通过core.varbialbeNameOkay从任何地方静态访问它,这在大多数情况下都非常有效。然而,我有一个MovieClip符号,它是一个曾孙,这是不可避免的,它不能通过Core.testvar访问变量testvar,不像stage可以。那里发生了什么事?顺便说一句,它是公共静态变量,而不仅仅是公共静态变量…希望您不介意进行小编辑。如果您想静态访问它,您可以将静态变量设置为该曾孙变量。在类代码中有一个公共静态var someMC:MovieClip,然后在代码中有权访问曾孙:Core.someMC=
外孙体细胞;然后从那时起,您就可以静态地访问MC。请记住,这是关于垃圾收集的一个引用,如果需要销毁该对象,请设置静态变量someMC=null。我想让孙子访问核心。坦率地说,这个答案相当混乱……你能澄清一下吗?这如何解决我的问题?您应该避免用异常阻塞类构造函数。与单元测试的兼容性很重要,因为很难正确地测试单例。我通常只使用ASDoc在singleton中给出关于该类的注释。