Просмотр полной версии : Динамическое создание переменных в экземпляре класса
Serious06
03.03.2009, 20:25
Подскажите, как динамически создавать переменные классах?
Допустим, хочу, чтобы цикл создал (_parts) штук public переменных с именами ("_part"+i)
class Cls {
public var _parts;
function Cls(parts) {
_parts = parts;
for(var i=0; i<_parts; i++) {
/* --- */
}
}
}
Такое возможно? Массивы не подходят, т.к. переменные - строки по 15000 символов, целевой девайс загибается от таких массивов. Пробовал без классов - работал метод set();
Метод сет это тоже самое что = только древний. Класс нужно сделать динамическим тогда все будет работать.
Serious06
03.03.2009, 21:06
Отлично, заработало, создаю в конструкторе, видны внутри класса. А как сделать их public?
И еще вопрос, разве можно как-то без set() создать переменную с неизвестным заранее именем?
Вам наооборот нужно делать финты ушами, чтобы сделать ваши переменные private - используя ASSetPropFlags... и то это все равно будет условность... в АС2 нету приватных переменных.
Serious06
03.03.2009, 21:23
В конструкторе:
_part0 = "str";
trace("конструктор: "+_part0);
Во флешке:
import Cls;
var tmp = new Cls(50);
trace("флешка: "+tmp._part0);
Вывод:
конструктор: str
флешка: undefined
Метод сет это тоже самое что = только древний. Класс нужно сделать динамическим тогда все будет работать.
топик по ас2: все классы динамические и публичные.
class A {
function setDinamicProperties()
{
for(var i=0;i<10;i++)
this["dynamic_property"+i]=i;
}
}
Даже более того:
b = new A();
b.dynamic_property11=11;
Serious06
03.03.2009, 21:31
О, спасибо, через this[] заработало!
Вам наооборот нужно делать финты ушами, чтобы сделать ваши переменные private - используя ASSetPropFlags... и то это все равно будет условность... в АС2 нету приватных переменных.
Я ничего не понял :). Кроме того что нету приватных переменных)(Хотя внешне то они недоступны :/).
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 минуты
топик по ас2 - все классы динамические и публичные.
Действительно :/. Правда если он не динами компилятор будет недоволен.
Финт - сложный фокус с игральными картами, чтобы его сделать нужно одновременно двумя руками поменять карты в колоде так, чтобы остальные этого не заметили, сделать такой фокус ушами не возможно.
"Финты ушами" - значит, что то, что вы будете пытаться сделать в принципе не возможно, и при этом со стороны выглядит как очень трудноосуществимая задача.
Вы можете попытаться осуществить вашу задачу и через Object.addProperty() и через Object.watch() и через Object.__resolve(), но в конечном счете вы все равно прийдете к выводу, что содать содать свойство не видимое вне класса в АС2 не возможно.
А если это будет getter. А в нем будет проверка равенства __proto__ и arguments.caller.__proto__? :). Хотя конечно метод можно будет вызвать. Но нельзя будет просто получить его значение. Да и в принципе никому это нинадо. Вот в питоне например тоже нету в принципе приватных переменных и ничего. Еще бы можно было незная имен переменных получать их, для тестов бы пригодилось.
Mnilionic
03.03.2009, 22:29
Еще бы можно было незная имен переменных получать их, для тестов бы пригодилось.
for( prop in obj){// цыкл по всем свойствам объекта}
Попробуй это с классом. Такой метод подойдет только для обьекта, или для класса если поля были заданы ему как обьекту. Типа Class['prop'] = value;. Тоже самое с пакетами, когда в пакете допустим 3 класса ttt.a, ttt.b, ttt.c. А мы сделаем import ttt.*. Попробуем сделать трейс: for(var class:String in ttt)trace(class+'='+ttt[class]); мы ничего не получем, а если же будет обрашение перед этим циклом к классам из пакета: trace(ttt.a+', '+ttt.b); то все выйдет.
А если это будет getter. А в нем будет проверка равенства __proto__ и arguments.caller.__proto__? :). Хотя конечно метод можно будет вызвать. Но нельзя будет просто получить его значение. Да и в принципе никому это нинадо. Вот в питоне например тоже нету в принципе приватных переменных и ничего. Еще бы можно было незная имен переменных получать их, для тестов бы пригодилось.
Ну если прям так припрет - сделаю делегат специально для этого геттера, и все равно вызову :)
Приватные свойства нужны для удобства, а делать столько усилий ради того, чтобы их только создать - уже само по себе вызывает улыбку.
Ну они изначально были как условность, а строая видимость приватный/публичный нужна лиш в популярных языках. Т.к многие будут путатся нарушать инкапсуляцию и тд... Естественно нормальный человек просто так не полезет к методу, если он в принципе должен быть приватным.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.