Вместо использования жестко закодированного оператора switch, в котором вы передаете ему имя строки класса, а затем создает экземпляр соответствующего класса, я хотел бы передать фактическое имя класс к моему заводскому методу и динамически создать экземпляр этого класса. Я думал, что это будет тривиально, и я удивлен, что он не работает. Должно быть, я что-то довольно основной хватает:AS3 - метод параметризованной фабрики с использованием имени фактического класса
Пример кода:
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?");
}
}
Единственное, что может быть немного странным (не уверен), что эти «продукты» на самом деле связаны элементы библиотеки (то есть: я есть MovieClip в библиотеке, которая имеет связь с Product1Class, а другой к Product2Class оба из которых продлить ProductBaseClass, который, в свою очередь расширяет MovieClip.
Почему ReferenceError?
Ненавижу, когда это происходит - пример, который я опубликовал выше, должен был быть абстракцией моей реальной ситуации в реальном мире. Когда я НАСТОЯТЕЛЬНО проверил мой пример, он работает как первоначально опубликованный, никаких ошибок ссылки. Кровавый ад. Итак, теперь я остаюсь с попыткой выяснить разницу между моим фактическим кодом и этим рабочим примером. Одно из очевидных различий в том, что элемент библиотеки в моей реальной FLA цветовой код GREEN. Я понятия не имею, насколько это значимо - что означает значок элемента с зеленым цветом? –
Никогда не видел символика зеленой кодировки библиотеки до ... удачи! –
Хорошо, зеленый код цвета означает, что связанный класс расширяет Sprite, а не MovieClip. К сожалению, это не проблема в моем конкретном случае. –