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

Serious06 03.03.2009 20:25

Динамическое создание переменных в экземпляре класса
 
Подскажите, как динамически создавать переменные классах?
Допустим, хочу, чтобы цикл создал (_parts) штук public переменных с именами ("_part"+i)
Код AS1/AS2:

class Cls {
        public var _parts;
 
        function Cls(parts) {
              _parts = parts;
              for(var i=0; i<_parts; i++) {
                    /* --- */
              }
        }
}

Такое возможно? Массивы не подходят, т.к. переменные - строки по 15000 символов, целевой девайс загибается от таких массивов. Пробовал без классов - работал метод set();

qazwsx 03.03.2009 20:42

Метод сет это тоже самое что = только древний. Класс нужно сделать динамическим тогда все будет работать.

Serious06 03.03.2009 21:06

Отлично, заработало, создаю в конструкторе, видны внутри класса. А как сделать их public?
И еще вопрос, разве можно как-то без set() создать переменную с неизвестным заранее именем?

wvxvw 03.03.2009 21:16

Вам наооборот нужно делать финты ушами, чтобы сделать ваши переменные private - используя ASSetPropFlags... и то это все равно будет условность... в АС2 нету приватных переменных.

Serious06 03.03.2009 21:23

В конструкторе:
Код AS1/AS2:

_part0 = "str";
trace("конструктор: "+_part0);

Во флешке:
Код AS1/AS2:

import Cls;
var tmp = new Cls(50);
trace("флешка: "+tmp._part0);

Вывод:
Код:

конструктор: str
флешка: undefined


Котяра 03.03.2009 21:26

Цитата:

Сообщение от qazwsx (Сообщение 802768)
Метод сет это тоже самое что = только древний. Класс нужно сделать динамическим тогда все будет работать.

топик по ас2: все классы динамические и публичные.
Код AS1/AS2:

class A {
function setDinamicProperties()
{
for(var i=0;i<10;i++)
this["dynamic_property"+i]=i;
}
}


Даже более того:
Код AS1/AS2:

b = new A();
b.dynamic_property11=11;


Serious06 03.03.2009 21:31

О, спасибо, через this[] заработало!

qazwsx 03.03.2009 21:35

Цитата:

Сообщение от wvxvw (Сообщение 802778)
Вам наооборот нужно делать финты ушами, чтобы сделать ваши переменные private - используя ASSetPropFlags... и то это все равно будет условность... в АС2 нету приватных переменных.

Я ничего не понял :). Кроме того что нету приватных переменных)(Хотя внешне то они недоступны :/).

Код AS1/AS2:

dynamic class Lolth
{
        public function Lolth()
        {
 
        }
 
        public function test(count:Number):Void
        {
                for (var i:Number = 0; i < count; i++)
                {
                        this['variable' + i] = i;
                }
        }
}
 
var l:Lolth = new Lolth();
l.test(10);
trace(l.variable1);//1

Добавлено через 2 минуты
Цитата:

Сообщение от Котяра (Сообщение 802783)
топик по ас2 - все классы динамические и публичные.

Действительно :/. Правда если он не динами компилятор будет недоволен.

wvxvw 03.03.2009 21:53

Финт - сложный фокус с игральными картами, чтобы его сделать нужно одновременно двумя руками поменять карты в колоде так, чтобы остальные этого не заметили, сделать такой фокус ушами не возможно.
"Финты ушами" - значит, что то, что вы будете пытаться сделать в принципе не возможно, и при этом со стороны выглядит как очень трудноосуществимая задача.
Вы можете попытаться осуществить вашу задачу и через Object.addProperty() и через Object.watch() и через Object.__resolve(), но в конечном счете вы все равно прийдете к выводу, что содать содать свойство не видимое вне класса в АС2 не возможно.

qazwsx 03.03.2009 22:17

А если это будет getter. А в нем будет проверка равенства __proto__ и arguments.caller.__proto__? :). Хотя конечно метод можно будет вызвать. Но нельзя будет просто получить его значение. Да и в принципе никому это нинадо. Вот в питоне например тоже нету в принципе приватных переменных и ничего. Еще бы можно было незная имен переменных получать их, для тестов бы пригодилось.


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

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