Создание класса по строковому имени
Всем доброго времени суток. Сегодня рассмотрим интересную задачу с которой сталкиваются начинающие (да и не только) разработчики на Flash. Итак, нам дана строка с именем класса и все что нам нужно — создать такой класс. То есть к примеру у нас есть строка «Myclass» и нам хотелось бы создать объект с таким именем, ну что ж, приступим.
Создадим класс Generator в пакете colors, задачей которого будет работа с генерацией цветовых объектов. Обратите внимание, отсутствует метод конструктор, мы не будем писать в нем код, поэтому можно его не писать.
-
package colors{
-
public class Generator{
-
private var str=‘Myclass’;
-
public function getRandomColor(){
-
}
-
}
-
}
Как поступить лучше? Какой способ выбрать? Как сделать проще, компактнее и чтобы работало быстрей?
Давайте рассмотрим первый способ — решение в «лоб» — первое что придет на ум это использовать условный оператор.
-
package colors{
-
public class Generator{
-
private var str=‘Myclass’;
-
public function getRandomColor(){
-
if (str==‘Myclass’)
-
return new MyClass();
-
}
-
}
-
}
Ну что ж, решение имеет место быть и написав где-нибудь var generator = new Generator(); а затем и var new_color = generator.getRandomColor(), мы получим новый класс. Все бы хорошо, но что если таких строк как наша строка «Myclass» будет много? Можно конечно использовать множество условий if или оператор switch. А что если мы не знаем, как будет называться наш класс? Что делать тогда и как быть?! Использовать метод getDefinitionByName из пакета flash.utils. Данный метод делает ни что иное, как возвращает нам класс по строке иными словами если у вас имя класса храниться в строке, то вы получите свой класс, если он конечно определен, иначе будет сгенерировано исключение. Таким образом можно модифицировать наш код следующим образом:
-
package colors{
-
public class Generator{
-
private var str=‘Myclass’;
-
public function getRandomColor(){
-
return new (getDefinitionByName(str));
-
}
-
}
-
}
Здорово, не правда ли? Если теперь мы изменим строку, на работу это никак не повлияет, если у вас конечно имеется класс с таким именем, но имейте в виду, что соблюдения регистра очень важно, то есть строка должна иметь полное соответствие имени класса, хотя это думаю итак понятно, а теперь немного модифицируем наш код до более полезной штуки)
-
package colors{
-
public class Generator{
-
private var colors_set = new Array(‘Aqua’,‘Black’,‘Blue’,‘Green’,‘Magenta’,
-
‘Orange’,‘Red’,‘White’,‘Yellow’);
-
public function getRandomColor(){
-
return new (getDefinitionByName(colors_set[Math.floor(Math.random()*90/10)]));
-
}
-
}
-
}
Поясню смысл написанного. Вместо строковой переменной у нас массив из 9 цветов. Внутри функции я случайным образом выбираю строку из массива, затем получаю класс с таким именем и создаю его. На сегодня — все.
На последок
Ситуация, когда нам необходимо создавать объект, не задумываясь о его имени очень часто встречается, например, нам надо создать 3 фигурки разных цветов, 5 объектов интерьера и т. д. Такой подход сократит код и что немаловажно ускорит работу приложения в отличие от условий if и switch.