在AS3/Flash CS5中全局导入类
我在ActionScript 3、Flash Professional CS5.5和AIR 3中有一个项目 我有几个需要访问的自定义类。目前,我正在通过传统方法成功访问:在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(); 然而,我在代码中实现了……这创建了类的一个副本,而不授予对原始类的访问权。这当然是一个问题——我需要一个符号的脚本来修改类中的变量,而另一个符号的脚本则访问该变量。显然,现在,这并没有发生 我如何做我所描述的?我
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中给出关于该类的注释。