Форум 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=178165)

rs7 16.04.2012 14:51

Обращение к классу в статическом методе этого класса
 
Есть код:
Код AS3:

package {
 
    public class ClassName {
 
        trace(ClassName);
        staticFunction();
 
        public static function staticFunction():void {
            trace(ClassName);
        }
 
    }
 
}

Почему мы получаем на выходе:

Цитата:

[class ClassName]
null

MikroAcse 16.04.2012 15:02

Код AS3:

package {
 
    public class ClassName {
        public function ClassName():void {
            staticFunction();
        }
 
        public static function staticFunction():void {
            trace(new ClassName());
        }
 
    }
 
}


Aquahawk 16.04.2012 15:26

MikroAcse это совсем не то что хотел автор вопроса. Вопрос на самом деле интересный и глубокий, сейчас нет времени посмотреть почему. Действие происходит в статик ините, почему в нём самом объект класса доступен, а в статик методе нет, не очень понятно. Разве что avm2 пропишет методам их класс уже после инициализации. С другой стороны он же знает что за метод стоит вызвать в этот момент, значит отношение класс -> метод уже установлено, а вот обратное похоже устанавливается после инициализации класса. Я не знаю как это точно устроено.

Добавлено через 3 часа 49 минут
Нашёл некоторые мысли, вечером из дома напишу.

rs7 17.04.2012 09:00

Напоминаю про "Мысли" =)

Aquahawk 17.04.2012 11:07

Я вчера начал писать, там целая статья будет. Если крадко, то во время статик инита сслыка на класс в global ещё не прописана. А компилятор по разному получает эту ссылку для обращения к классу и для создания объекта например, поэтому
Код AS3:

package {
 
    public class ClassName {
 
        trace(ClassName);
        staticFunction();
 
        public static function staticFunction():void {
            trace(ClassName);
            trace(new ClassName());
        }
 
    }
 
}

Код:

[class ClassName]
 null
[object ClassName]

Это потому что в функции он ищет класс как this(на самом деле в статиках на уровне ассемблера есть this и там это класс) если хотим создать объект, и достаёт из глобала если хотим получить ссылку на класс.

Добавлено через 5 минут
Код AS3:

 trace(ClassName);

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


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

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