当前位置: 代码迷 >> Web前端 >> AS3单例、反照---mx.core.Singleton
  详细解决方案

AS3单例、反照---mx.core.Singleton

热度:620   发布时间:2012-08-30 09:55:54.0
AS3单例、反射---mx.core.Singleton

一、先说一下AS3中的反射

public function getDefinitionByName(name:String):Object

返回 name 参数指定的类的类对象引用。

?

以下示例使用 GetDefinitionByNameExample 类在舞台上创建一个橙色的正方形。这是使用以下步骤完成的:?

声明代表橙色背景颜色和 80 像素大小的变量,这些变量稍后将用于绘制正方形。

在构造函数内,将 Class 类型的变量 ClassReference 赋予 Sprite。

对名为 instance 的 ClassReference 的实例进行实例化。

由于 instance 按引用是 Sprite 对象,因此可以使用可用于 Sprite 的方法绘制正方形并将其添加到显示列表。

?

package {

?? ?import flash.display.DisplayObject;

?? ?import flash.display.Sprite;

?? ?import flash.utils.getDefinitionByName;

?

?? ?public class GetDefinitionByNameExample extends Sprite {

?? ? ? ?private var bgColor:uint = 0xFFCC00;

?? ? ? ?private var size:uint = 80;

?

?? ? ? ?public function GetDefinitionByNameExample() {

?? ? ? ? ? ?var ClassReference:Class = getDefinitionByName("flash.display.Sprite") as Class;

?? ? ? ? ? ?var instance:Object = new ClassReference();

?? ? ? ? ? ?instance.graphics.beginFill(bgColor);

?? ? ? ? ? ?instance.graphics.drawRect(0, 0, size, size);

?? ? ? ? ? ?instance.graphics.endFill();

?? ? ? ? ? ?addChild(DisplayObject(instance));

?? ? ? ?}

?? ?}

}

?

注意,当我们使用自定义的类TestClass时,可能会报ReferenceError:Error #1065:变量TestClass未定义。

这是因为运行中反射,在SWF中取不到TestClass类编译的文件。即使import了也不行,因为import的类只要没有用到,还是会被编译器当作垃圾自动忽略掉。

解决办法也很简单,在工程别的地方用一下TestClass,或者在本类中声明一个未实例化的变量比如var tc:TestClass,或者直接TestClass不声明变量亦可。

?

二、看一下mx.core.Singleton的源码:

private static var classMap:Object = {};

?

public static function registerClass(interfaceName:String,clazz:Class):void{

var c:Class = classMap[interfaceName];

if(!c)

? classMap[interfaceName] = clazz;

}

?

public static function getClass(interfaceName:String):Class{

return classMap[interfaceName];

}

?

public static function getInstance(interfaceName:String):Class{

var c:Class = classMap[interfaceName];

if(!c)

{

? throw new Error("No class registered for interface '" + interfaceName + "'.");

}

return c["getInstance"]();

}

代码很简洁,比如在类FlexModuleFactory中注册:

Singleton.registerClass("mx.managers::IHistoryManager",

Class(getDefinitionByName("mx.managers::HistoryManagerImpl")));

?

比如在DataGridColumn中取出:

_embeddedFontRegistry = IembeddedFontRegistry(

Singleton.getInstance("mx.core::IembeddedFontRegistry"));

?

需要注意的是这句:return c["getInstance"]();

它等于上面例子中的写法:

?? ?var ClassReference:Class = getDefinitionByName("interfaceName") as Class;

?? ?var instance:Object = new ClassReference();

?? ?return instance.getInstance();

?

三、参考链接:How to use mx.core.Singleton(http://www.duzengqiang.com/blog/post/607.html)

  相关解决方案