Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Имя класса из объекта (http://www.flasher.ru/forum/showthread.php?t=105859)

wizzard555 25.12.2007 16:26

Имя класса из объекта
 
Я изучаю большой проект на флеш.
Есть функция:
class MyClass
{
....
function update(infoObj)
{
....
}
}
Можно ли в теле функции узнать к какому классу принадлежит infoObj? Я написал огромную процедуру, в которой проверяется на соответствие всем классам в проекте (около 150 проверок), но меня это не устраивает. Может есть какой-нибудь метод проверки, кроме instanceof?

Потом, я вижу (через trace), что значения полей infoObj меняются не в самой процедуре, а за ее пределами. Хм....в проекте около 100 классов и половина из них содержат переменную-объект infoObj. Нельзя ли проследить, где происходит инициализация этого объекта?

Поиск использовал.

iNils 25.12.2007 16:31

1. Нельзя. Единственный выход, это в каждом классе создать статичное поле, где указывать имя класса.
2. Не понял сути вопроса.

wvxvw 25.12.2007 17:03

Я обычно в таких случаях пишу в классах что-то типа:
Очень помогает при трейсе и т.п.
Код:

class ClassA {
public function toString():String {
return "[ClassA]";
}
}

Соответственно, туда можно добавить разные дополнительные сведения, (например, инстансы имеют свой ИД - его тож можно туда, версию ну и т.п.

wizzard555 25.12.2007 20:34

Все это классно, но пока AS не то чтобы до С++, а даже до дельфийской VCL очень далеко.
И скрытых никаких полей нет?

В Делфи, например, есть стек вызовов. И видно откуда (по иерархии эта процедура вызывалась. Ничего подобного в AS нет?

iNils 25.12.2007 20:42

2 wvxvw, toString для этого использовать не гуд.
2 wizzard555, есть, если использовать mtasc, он может узнать имя класса, метод и номер строки от куда был вызван trace

wvxvw 26.12.2007 01:19

Ну, собственно... если это делать в своих классах, и делать это сознательно - ничего страшного быть не должно. Ну, за исключением всех наследуемых от MovieClip - там в трейс попадает не toString, а _name. Ну и еще не стоит это делать со всякими наследуемыми от, например, XMLNode классами - там где toString() нужен в первозданном виде.

С другой стороны, можно перебирать все переменные в _global (чем по-сути являются классы) и пытаться выяснить является ли объект вызвавший проверку инстансом одной из этих переменных-классов. Проблема в том, что если классов много и уровень вложенности тоже большой, то прийдется сделать кучу операций - вобщем, не рационально.
Код:

class myClass {
        private static var __registrationDone:Boolean = false;
        private static var __di:Function = function():Void {
                Object.prototype.debuggerINFO = function():String {
                        if(!this.__debuggerINFO){
                                _global.ASSetPropFlags(_global,null,8,true);
                                var s;
                                for(var i in _global){
                                        if(this instanceof _global[i]){
                                                if(s instanceof _global[i] || !s){
                                                        s = i;
                                                }
                                        }
                                        for(var j in _global[i]){
                                                if(this instanceof _global[i][j]){
                                                        if(s instanceof _global[i][j] || !s){
                                                                s = j;
                                                        }
                                                }
                                                for(var k in _global[i][j]){
                                                        if(this instanceof _global[i][j][k]){
                                                                if(s instanceof _global[i][j][k] || !s){
                                                                        s = k;
                                                                }
                                                        }
                                                }
                                        }
                                }
                                if(s){
                                        this.__debuggerINFO = s;
                                        return "["+s+"]";
                                }
                        } else {
                                return "["+this.__debuggerINFO+"]";
                        }
                        return "[Unsigned class]";
                }
        }
        function myClass(){
                if(!__registrationDone){
                        __di();
                        __registrationDone = true;
                }
                };
}

Код:

import flash.geom.Matrix;
//
var mc:myClass = new myClass();
var mtx:Matrix = new Matrix();
trace(mc["debuggerINFO"]()); // [myClass]
trace(_root["debuggerINFO"]()); // [MovieClip]
trace(mtx["debuggerINFO"]()); // [Matrix]

Вот, это общая идея, но чет ничего лучше не придумал

etc 26.12.2007 02:13

Цитата:

Сообщение от wizzard555
В Делфи, например, есть стек вызовов. И видно откуда (по иерархии эта процедура вызывалась. Ничего подобного в AS нет?

Есть, но в AS3.

iNils 26.12.2007 10:47

wvxvw, ты меня начинаешь пугать своими постоянными хаками и спорными решениями. Если тебе так нравится, ладно. Но не учи этому других.
Достаточно сделать
Код:

class net.world.MyClass {
        private static function get CLASS_NAME ():String {
                return "net.world.MyClass";
        }
        ....
        function update(infoObj) {
        ....
        }
}

В FD/FDT подправить шаблоны, и эти строчки будут автоматичски добавляться при создании нового класса. Нужно сделать больше при вызове, дополняй функцию.
А у toString совсем другие задачи.

wvxvw 26.12.2007 12:48

Ну, прям-таки хак... Вобщем, не знаю, думаю, что если человек разберется с кодом, то сможет уж сам решить, хочется ему его использовать или нет. Я же не заставляю делать именно так.
А toString() часто вообще не выполняет никаких функций... В классах ММ довольно часто встречается ситуация, когда его именно для этого используют.


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

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