Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как добавить динамическую переменную к DisplayObject без создания доп. класса (http://www.flasher.ru/forum/showthread.php?t=180977)

Universe 12.06.2012 19:38

Как добавить динамическую переменную к DisplayObject без создания доп. класса
 
Мне нужно добавить моему DisplayObject динамическое свойство, например
someDispObj.someVar = 10;
как я могу это сделать без создания динамического класса?

КорДум 12.06.2012 19:44

Никак. Зачем Вам такое понадобилось? Думаю, Вам нужно выделить этот ДО в отдельную сущность-класс.

XoJlToH 12.06.2012 22:22

С мувиклипами такое точно проходит

MoHaX 12.06.2012 22:58

Тебе нужен динамический класс, MovieClip подойдет, но вообще это не красиво.

expl 12.06.2012 23:04

Там для кое-каких не MovieClip-ов тоже чудесным образом проходит, если во Flash IDE собирать, а потом, когда пытаеся заюзать Tween-овую либу, компилируя mxmlc и говоришь автору "Чувак, падает!". Автор делает каменное лицо и заявляет что у него все работает, а для не визуальных объектов твинер применить никогда не потребуется.

Если потребовалось что-то сохранить для объекта, но на нём самом этого делать не нужно/нельзя, то на ум приходят решения:

1. Меппинг значения в Dictionary - мепит та подсистема, которой нужны эти значения. Одно из достоинств - 2 подсистемы могут держать для объекта свои разные значения. Недостатки - куча кода, надо следить очень внимательно за добвалением и удалением.

2. Обертка, т.е. храним у себя в подсистеме не сами объекты, а объекты со свойтсвами и ссылкой на эти оригинальные объекты. За соответствием значений и объектов уследить проще, чем в первом случае, но эти обертки надо как-то добавлять и удалять в нашу подсистему.

3. Можно вообще везде таскать обертки вместо объектов, если есть возможность влезть во все места

4. Еще проще (если ограничения наследования не включатся) отнаследоваться и добавить поля и везде таскать наследника, если, опять же есть доступ во все части, где объекты используются.

Кстати, какая цель? Просто, я подозреваю, что для Вашей задачи есть решение гораздо красивше этих 4-х и не требующее никаких меппингов/списков/регистров этих объектов.

Universe 13.06.2012 12:11

У меня есть объект, которому я добавляю некоторую функциональность с помощью статического метода другого класса. Чтото на подобии своего TweenLite. Допустим что я приеняю к объекту гравитацию. Затем где то в коде мне нужно будет определять есть на этом объекте гравитация или нет. Наиболее удобным вариантом, как мне кажется, является создание в моём объекте переменной isGravity, на которую я буду воздействовать вызывая статический метод. Но такое не прокатывает для всех типов DisplayObject. Может тогда завести в этом статическом классе массив, в который пушить объект на который применили гравитацию, а потом смотреть циклом в этот массив и определять есть ли такой объект в массиве?

udaaff 13.06.2012 12:21

Создайте соответствующий интерфейс со свойством isGravity, который должны будут реализовать объекты, с которыми может работать ваш класс, и реализуйте его.
Или еще вариант. Создать дополлнительный "подкласс" в классе "менеджере" этих объектов, например, MyGravityObjectRegistration. Создавать экземпляр данного класса при добавлении объектов с графитацией, и в нём уже хранить ссылку на сам объект и дополнительные параметры.

Universe 13.06.2012 12:35

как то не хотелось бы создавать отдельный класс, ради одного свойства. Для этого и использую в данном случае статический метод, вместо создания класса.

КорДум 13.06.2012 12:52

Не экономьте байты. И место в листингах кода.

ChuwY 13.06.2012 13:03

Можно провернуть вот такой изврат (исключительно ради изврата):


Код AS3:

package {
  import flash.display.Sprite;
 
  public class tests extends Sprite {
    private var _enemy : Unit = new Unit();
    public function tests() {
      var propName : String = 'foo';
      traceProperty(_enemy, propName);//target don't contain prop 'foo'
      addProperty(_enemy, 'foo', 'bar');
      traceProperty(_enemy, propName);// bar
    }
 
    private function addProperty(target : Object, propName : String, defValue : *):void{
      Object(target).constructor.prototype[propName] = defValue;
    }
 
    private function traceProperty(target : Object, propName : String):void{
      try{
        trace(target[propName]);
      } catch(error : Error){
        trace("target dont contain prop " + propName);
      }
    }
  }
}
 
internal class Unit {
  public function Unit() {
  }
}



Часовой пояс GMT +4, время: 04:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.