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

V01D 23.05.2012 15:36

Проверка существования класса
 
Много уже нарыл здесь...
Только не получаеса!

Значитса классы для звуков я определяю так:
Код AS3:

[Embed(source = "../../lib/Source/Battle/sound/1/1.mp3")] private var Bs_1_1_cls : Class;
[Embed(source = "../../lib/Source/Battle/sound/1/2.mp3")] private var Bs_1_2_cls : Class;
...
[Embed(source = "../../lib/Source/Battle/sound/2/1.mp3")] private var Bs_2_1_cls : Class;
[Embed(source = "../../lib/Source/Battle/sound/2/2.mp3")] private var Bs_2_2_cls : Class;
..
[Embed(source = "../../lib/Source/Battle/sound/n/1.mp3")] private var Bs_n_1_cls : Class;
[Embed(source = "../../lib/Source/Battle/sound/n/2.mp3")] private var Bs_n_2_cls : Class;
      ...[Embed(source = "../../lib/Source/Battle/sound/n/m-1.mp3")] private var Bs_n_m-1_cls : Class;
        [Embed(source = "../../lib/Source/Battle/sound/n/m.mp3")] private var Bs_n_m_cls : Class;

Затем для создания объектов на основе этих классов
Определяю массив
Код AS3:

public var SoundObj : Array = new Array();

Далее в коде хочу сослатся на эти классы и получить объекты в массиве!
Код AS3:

var RabArrSound : Array;        
for (i= 1; i <= n ; i++) {       
          if (this["Bs_" + String(i) + "_1_cls"]) {
                RabArrSound = new Array();
                SoundObj[i] = RabArrSound;
        }else{
                break;
        }       
        for (var j:int = 1; j <= m ; j++) {       
                if (this["Bs_" + String(i) + "_" + String(j) + "_cls"]) {                       
                        SoundObj[i][j] = new this["Bs_" + String(i) + "_" + String(j) + "_cls"]();
                }
        }
}

Для корректного обращения в ходе программы.


- m - для различных i могут быть разные; поэтому берется максимальное значение!
- (т.е. нужна проверка на существование классов(что и видно в коде))
- кроме того некоторые i - в классах могут отсутствовать (смотреть предвдущий пункт)

Выдает ошибку при обращении к несуществующему классу

Код AS3:

if (this["Bs_" + String(i) + "_1_cls"]) {
...
 if (this["Bs_" + String(i) + "_" + String(j) + "_cls"]) {
...

Какую проверку здесь можно использовать, чтобы не заморачиватся на наличие или отсутствие класса?


Пробовал:
ApplicationDomain.currentDomain.hasDefinition
Как здесь советовали:
http://www.flasher.ru/forum/showthre...=111716&page=2

Но на все запросы:
Код AS3:

ApplicationDomain.currentDomain.hasDefinition("Bs_" + String(i) + "_" + String(j) + "_cls")

Выдает false

try catch использовать не хочу...

Подскажите что в этом случае можно сделать...

maxkar 23.05.2012 15:54

У вас не проверка существования класса. У вас проверка наличия поля. Сам класс имеет другое имя (потрейсите ваш Bs_1_1_cls). Может, Object.hasOwnProperty(String) поможет?

i.o. 23.05.2012 15:57

Код AS3:

if (this["Bs_" + String(i) + "_1_cls"]) {

замените на
Код AS3:

if (("Bs_" + String(i) + "_1_cls") in this) {

должно помочь

V01D 23.05.2012 16:10

maxkar
Код AS3:

Object.hasOwnProperty(String)

false на все объекты
в качестве Object - this

i.o.
Код AS3:

("Bs_" + String(i) + "_1_cls") in this

тоже false на все объекты!

при этом если оставить
Код AS3:

this["Bs_" + String(i) + "_" + String(j) + "_cls"]

n=6
m=3
все объекты от 1 до 6
задаются по 3
кроме последнего 6-го
т.е. объекта SoundObj[6][3] - не существует


то при компиляции доходит до этого объекта
и если посмотреть массив SoundObj он заполнен
т.е. объекты ЕСТЬ

:(

expl 23.05.2012 18:43

Цитата:

maxkar
Код AS3:
Object.hasOwnProperty(String)
false на все объекты
Угу, потому что поля приватные.

Наличие классов вряд ли удастся посмотреть - они там с постфиксами по настроению компилятора генерируются при таком эмбединге.

Если нужно просто пройтись по списку, то я бы так сделал:
1. Поменять все поля на публичные
2. Получить xml-ку через describeType(this)
3. Прочитать все названия полей из этой xml-ки и вызвать их через this[fieldName]

Ну, или просто, как вы делали, но с публичными полями и проверкой hasOwnProperty

V01D 23.05.2012 21:03

Ура СПАСИБО...

И это
Object.hasOwnProperty(String)
И это
("Bs_" + String(i) + "_1_cls") in this

при паблик работает!

Хотелось бы (для общего развития) знать в чем отличие!...
И почему как привейт не видит?


Еще раз СПАСИБО :)


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

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