我在ActionScript 3,Flash Professional CS5.5和AIR 3中有一个项目。
我有几个需要访问的自定义类。目前,我通过传统方法成功访问:
import trailcrest.core.core;
var Core:core = new core();
然而,我在我的代码中实现了...这创建了类的COPY,并且不提供对原始文件的访问。这当然是一个问题 - 我需要一个符号的脚本来修改类中的变量,而另一个符号的脚本访问该变化的变量。显然,现在,情况并未发生。
我如何做我所描述的?我应该以某种方式为类创建一个“公共变量”(虽然我需要有关如何做到这一点的说明......我不能在阶段或符号中使用“public var”)?有没有办法直接访问课程?
帮助!并提前感谢。
答案 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() ...
修改强>
当然,按照其他人的建议添加单例类型的方法可以使它更清晰,我也会对他们的答案进行投票。