![]() |
|
||||||||||
|
|||||
|
Регистрация: Dec 2007
Сообщений: 6
|
Я изучаю большой проект на флеш.
Есть функция: class MyClass { .... function update(infoObj) { .... } } Можно ли в теле функции узнать к какому классу принадлежит infoObj? Я написал огромную процедуру, в которой проверяется на соответствие всем классам в проекте (около 150 проверок), но меня это не устраивает. Может есть какой-нибудь метод проверки, кроме instanceof? Потом, я вижу (через trace), что значения полей infoObj меняются не в самой процедуре, а за ее пределами. Хм....в проекте около 100 классов и половина из них содержат переменную-объект infoObj. Нельзя ли проследить, где происходит инициализация этого объекта? Поиск использовал. |
|
|||||
|
Modus ponens
|
Я обычно в таких случаях пишу в классах что-то типа:
Очень помогает при трейсе и т.п. Соответственно, туда можно добавить разные дополнительные сведения, (например, инстансы имеют свой ИД - его тож можно туда, версию ну и т.п.
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 6
|
Все это классно, но пока AS не то чтобы до С++, а даже до дельфийской VCL очень далеко.
И скрытых никаких полей нет? В Делфи, например, есть стек вызовов. И видно откуда (по иерархии эта процедура вызывалась. Ничего подобного в AS нет? |
|
|||||
|
Modus ponens
|
Ну, собственно... если это делать в своих классах, и делать это сознательно - ничего страшного быть не должно. Ну, за исключением всех наследуемых от 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;
}
};
}
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 26.12.2007 в 01:24. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
|
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
|
wvxvw, ты меня начинаешь пугать своими постоянными хаками и спорными решениями. Если тебе так нравится, ладно. Но не учи этому других.
Достаточно сделать class net.world.MyClass {
private static function get CLASS_NAME ():String {
return "net.world.MyClass";
}
....
function update(infoObj) {
....
}
}
А у toString совсем другие задачи. |
|
|||||
|
Modus ponens
|
Ну, прям-таки хак... Вобщем, не знаю, думаю, что если человек разберется с кодом, то сможет уж сам решить, хочется ему его использовать или нет. Я же не заставляю делать именно так.
А toString() часто вообще не выполняет никаких функций... В классах ММ довольно часто встречается ситуация, когда его именно для этого используют.
__________________
Hell is the possibility of sanity |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:53. |
|
|
« Предыдущая тема | Следующая тема » |
|
|