【发布时间】:2011-06-04 02:28:13
【问题描述】:
我不想使用硬编码的 switch 语句,将类的字符串名称传递给它,然后实例化适当的类,我想将类的实际名称传递给我的工厂方法并动态使用创建该类的实例。我认为这将是微不足道的,很惊讶它不起作用。我一定错过了一些非常基本的东西:
示例代码:
createProduct(50, "Product1Class");
createProduct(5, "Product2Class");
private function createProduct(amount:uint, productClassName:String):void {
var productReference:Class;
try {
productReference = getDefinitionByName(productClassName) as Class;
for (var i:uint = 0; i < amount; i++) {
var product = new productReference() as ProductBaseClass; // throws reference error!
}
} catch (error:ReferenceError) {
throw new ReferenceError(error.message + " Have you linked a library item to this class?");
}
}
唯一可能有点奇怪(不确定)的是这些“产品”实际上是链接的库项目(即:我在库中有一个与 Product1Class 的链接和另一个与 Product2Class 的链接的movieClip扩展 ProductBaseClass,后者又扩展了 MovieClip。
为什么会出现 ReferenceError?
【问题讨论】:
-
我讨厌这种情况发生 - 我在上面发布的示例旨在抽象出我的实际现实情况。当我实际测试我的示例时,它按最初发布的方式工作,没有参考错误。该死的地狱。所以现在我要弄清楚我的实际代码和这个工作示例之间的区别。一个明显的区别是,我现实世界的 FLA 中的图书馆项目是用颜色编码的绿色。我不知道它是否重要 - 绿色编码的图书馆项目图标是什么意思?
-
以前从未见过绿色编码的库符号...祝你好运!
-
好的,绿色代码只是意味着链接的类扩展了 Sprite 而不是 MovieClip。不幸的是,在我的特殊情况下,这不是解决方法。
-
当产品类不在默认包中时,上面的示例不起作用。这是我不明白的部分。如果 Product1Class.as 文件与 FLA 和文档类位于同一目录中(无论 Factory 类在哪里),则它可以按预期工作。当您将 Product1Class 放入其自己的包(例如 com.test.products)中时,您会收到参考错误。那是怎么回事?
标签: actionscript-3 factory-pattern dynamic-class-creation