模块的域
默认的,一个模块会被加载进当前程序域(主程序)的一个子域。因此它自己的类定义只会在自己的域中。
问题:
“SchoolModule”中定义了一个“School”类来使用, 然后新加载的“StudentModule”中也使用“School”类(Main中没有用School类)。
Adobe FlashPlayer将抛出一个异常(School@5454不能转换成School)
原因是: “School”只存在于子域,而程序试图将“StudentModule”域中的 “School” 转换成 “SchoolModule” 域中的 “School”。
解决:
- 1. 在“主域”先定义(不太好的)
对于一些类,可以在Application中先使用他们,使其存在于“主域”,这样所有的子域都可以正常使用他们了。
如:
//定义一个“木偶变量”
private var school:School; - 2. 使用注射机制(SchoolShape中正在使用的)
对于一些单例模式(TileFactory), 可以在Module启动时, 把主程序上的 TileFactory.getInstance() 传递到新的Module上, 以保证 Main.tileFactory == Module.tileFactory。
如:
保证 Module上的对象和主程序上的是同一个
moduleInit() {
newModule.setTileFactory( main.tileFactory );
} - 3. 修改Module.applicationDomain(期待)
你可以通过ModuleLoader类的applicationDomain定义一个不同的程序域。
如:
moduleInit() {
moduleLoader.applicationDomain = ApplicationDomain.currentDomain;
} - ; }