Форум Flasher.ru

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

artfabrique 04.02.2011 13:32

Узнать класс экземпляра вызвавший статичный метод класса. Как?
 
У меня есть класс Vector2 (обычный математический вектор со всеми функциями)
Я хочу сделать что-то вроде дебаг отрисовки всех его экземпляров.
Но дабы не смешивалить все вектора хочу сделать рисование разными цветами на разных "слоях".
идентификатор слоя — это хэш имени класса экземпляра, который вызвал конструктор Vector2.

Вопрос: Как узнать в конструкторе Vector2 кто его вызвал, НЕ ПЕРЕДАВАЯ ПАРАМЕТРОВ (Хочется универсальности)

Думал как то обыграть через arguments.callee но хозяина функции тоже не понял как найти.

Psycho Tiger 04.02.2011 13:55

Увы, никак. Только даже если можно было бы — Вам бы это не помогло.
Приведите пример кода, как бы Вы хотели это дело видеть, может я не понимаю чего.

artfabrique 04.02.2011 14:15

Класс Main
Код AS3:

Vector2.debug = true;
var tempVector = new Vecto2(10,5);
var box = new MyBox();

Класс MyBox
Код AS3:

public function MyBox() {
    var vec:Vector2 = new Vector2();
}

Класс Vector2
Код AS3:

public static var debug:Boolean = false;
public static var layers:Object;
 
public function Vector2() {
      if(Vector2.debug) draw(ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР);
}
 
public function draw(ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР:Object):void {
    if(!layers) layers = {};
    var color:uint
    if(layers["hash_"+ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР]) {
          color = layers["hash_"+ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР];
    }else {
          color = getRandomColor();
          layers["hash_"+ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР] = color
    }
    drawLine(startPoint,endPoint,color);
}

Добавлено через 1 минуту
ну разумеется соверадийть toString() у всех

Psycho Tiger 04.02.2011 15:11

Код AS3:

public static var layers:Object;

Лучше подойдёт Dictionary и без презервативов вроде "hash"+..

Я вот проникнутся идеей так и не могу. Врубили дебаг, создали вектор и тут же его надо отрисовать в объекте, который его создал? А что если этот объект не DisplayObject?

artfabrique 04.02.2011 15:44

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

Добавлено через 2 минуты
и да на счет дикшинари - weak references не работают.
GC не отметает удаленные объекты потому что ссылки остаются в словаре.
в каких точно случаях - не знаю, но мемори лики мне не нужны.

Psycho Tiger 04.02.2011 16:00

Цитата:

и да на счет дикшинари - weak references не работают.
Причем тут они? Dictionary нужен вот зачем:
Код AS3:

if(layers["hash_"+ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР])

Код AS3:

  if(layers[ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР])

Цитата:

никто не сказал что в том же объекте.
имена типов нужны для разных цетов, а рисоваться все будет в отдельных дебаг слой
Хорошо, с этим всё понятно. Но зачем тогда знать экземпляр, который вызвал статичный метод?
У экземпляра должен быть метод debugTrace(), который может дёрнуть статичный метод и передать ему ссылку на себя.

artfabrique 04.02.2011 16:47

дело в том что использование объектов в виде ключей расценивается как ссылка на этот объект и гарбиджколлектор не будет удалять этот объект из оперативки пока на него есть хоть одна ссылка. В случае с объектам дисплей листе (например со снегом программным был случай) по непонятным причинам после удаления они не удаляются из памяти при использовании дишенари.

Зная экземпляр можно узнать тип (класс) и привести его к строке.
Ничего дополнительного в класс Vector2 передаваться не может.

Psycho Tiger 04.02.2011 16:55

Цитата:

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

В случае с объектам дисплей листе (например со снегом программным был случай) по непонятным причинам после удаления они не удаляются из памяти при использовании дишенари.
Наверное нужно было удалить их из диктионари.
Кстати, а когда использовали Object — проблемы не было? Я всё ещё могу достучаться до объекта через myHash.myObject

Ну как Вы будете вызывать метод, который отрисует этот вектор?

mikhailk 04.02.2011 17:19

Цитата:

дело в том что использование объектов в виде ключей расценивается как ссылка на этот объект и гарбиджколлектор не будет удалять этот объект из оперативки пока на него есть хоть одна ссылка
шаттл запускаете? :)
или планируется работа приложения в режиме 24х365?

мне кажется, в последнее время вокруг GC какой-то ненужный ажиотаж поднялся.


А по сабжу - я недавно хотел сделать аналогичную штуку типа статического трейсера, который сообщал бы, из какого метода какого экземпляра его вызвали. Общим собранием было решено, что это невозможно. Были идеи насчет анализа стека объекта Error (там есть метод, который возвращает стек вызовов на текущий момент), можно сюда покопать.

Psycho Tiger 04.02.2011 17:52

Error#getStackTrace.
Он возвратит только строчку кода и имя класса, но не ссылку на экземпляр. К тому же в релиз-плеере данная фишка недоступна.


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

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