Создание класса по строковому имени


Всем доброго времени суток. Сегодня рассмотрим интересную задачу с которой сталкиваются начинающие (да и не только) разработчики на Flash. Итак, нам дана строка с именем класса и все что нам нужно - создать такой класс. То есть к примеру у нас есть строка "Myclass" и нам хотелось бы создать объект с таким именем, ну что ж, приступим.

Создадим класс Generator в пакете colors, задачей которого будет работа с генерацией цветовых объектов. Обратите внимание, отсутствует метод конструктор, мы не будем писать в нем код, поэтому можно его не писать.

  1. package colors{

  2.     public class Generator{

  3.         private var str='Myclass';
  4.         public function getRandomColor(){
  5.         }
  6.     }
  7. }

Как поступить лучше? Какой способ выбрать? Как сделать проще, компактнее и чтобы работало быстрей?

Давайте рассмотрим первый способ - решение в "лоб" - первое что придет на ум это использовать условный оператор.

  1. package colors{

  2.     public class Generator{

  3.         private var str='Myclass';
  4.         public function getRandomColor(){
  5.             if (str=='Myclass')
  6.                 return new MyClass();
  7.         }
  8.     }
  9. }

Ну что ж, решение имеет место быть и написав где-нибудь var generator = new Generator(); а затем и var new_color = generator.getRandomColor(), мы получим новый класс. Все бы хорошо, но что если таких строк как наша строка "Myclass" будет много? Можно конечно использовать множество условий if или оператор switch. А что если мы не знаем, как будет называться наш класс? Что делать тогда и как быть?! Использовать метод getDefinitionByName из пакета flash.utils. Данный метод делает ни что иное, как возвращает нам класс по строке иными словами если у вас имя класса храниться в строке, то вы получите свой класс, если он конечно определен, иначе будет сгенерировано исключение. Таким образом можно модифицировать наш код следующим образом:

  1. package colors{

  2.     public class Generator{

  3.         private var str='Myclass';
  4.         public function getRandomColor(){
  5.             return new (getDefinitionByName(str));
  6.         }
  7.     }
  8. }

Здорово, не правда ли? Если теперь мы изменим строку, на работу это никак не повлияет, если у вас конечно имеется класс с таким именем, но имейте в виду, что соблюдения регистра очень важно, то есть строка должна иметь полное соответствие имени класса, хотя это думаю итак понятно, а теперь немного модифицируем наш код до более полезной штуки)

  1. package colors{

  2.     public class Generator{

  3.         private var colors_set = new Array('Aqua','Black','Blue','Green','Magenta',
  4.                                            'Orange','Red','White','Yellow');
  5.         public function getRandomColor(){
  6.             return new (getDefinitionByName(colors_set[Math.floor(Math.random()*90/10)]));
  7.         }
  8.     }
  9. }

Поясню смысл написанного. Вместо строковой переменной у нас массив из 9 цветов. Внутри функции я случайным образом выбираю строку из массива, затем получаю класс с таким именем и создаю его. На сегодня - все.

На последок

Ситуация, когда нам необходимо создавать объект, не задумываясь о его имени очень часто встречается, например, нам надо создать 3 фигурки разных цветов, 5 объектов интерьера и т. д. Такой подход сократит код и что немаловажно ускорит работу приложения в отличие от условий if и switch.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *