PDA

Просмотр полной версии : Создание экземпляров классов циклом


rdr144
13.10.2013, 02:04
Здравствуйте. Не могу найти решение проблемы, даже не знаю как правильно сформулировать запрос. В общем, имеется несколько однотипных классов, у которых имена отличаются только цифрами Loc0, Loc1, Loc2 и тд. Я хочу создать массив, в котором каждый элемент будет соответствовать экземпляру кажого класса, то есть:
locs[0] = new Loc0(); locs[1] = new Loc1(); locs[2] = new Loc2(); и тд. Проблема в том, что не получается создать все это одним циклом, код не работает

for (var i:int = 0; i < 10; i++)
{
locs[i] = new ['Loc' + i];
}
выдает ошибку TypeError: Error #1007: Попытка реализации в объекте, который не является конструктором.

я не понимаю как правильно записать это составное имя класса, чтобы в имени менялась только цифра, пробовал и
locs[i] = new ['Loc' + i]as Class;и
locs[i] = new ['Loc' + i]();и
locs[i] = new ['Loc' + i + '()'];

Никак ума не приложу, как это делается.

caseyryan
13.10.2013, 09:54
getDefinitionByName() (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/utils/package.html#getDefinitionByName())
а тут (http://www.emanueleferonato.com/2011/03/31/understanding-as3-getdefinitionbyname-for-all-eval-maniacs/) с примером по-лучше

rdr144
13.10.2013, 11:57
Большое спасибо!

Babylon
13.10.2013, 16:56
подход дилетанский и неверный.
нумеровать классы неправильно.
создайте метод с id

Akopalipsis
13.10.2013, 20:46
создайте метод с id
А можно немножечко подробней? я уже слышал про id, но так и не развил тему до полнейшего понимая.
Как раз сейчас я делаю фабрику и было бы лучше узнать всё до конца, а пока делаю вот как -
в фабрике есть метод с id:uint в параметрах. Так же есть класс с константами, которые хранят ссылки на классы. В самой фабрике есть таблица обжект где в качестве ключа id, а в качестве значения константа.
Это так делают или пишут id в самих классах?

Babylon
13.10.2013, 20:53
встроенных id у объектов в as3 нет

in4core
14.10.2013, 00:15
dictionary[id] = class

Akopalipsis
14.10.2013, 00:18
in4core Спасибо!

in4core
14.10.2013, 00:28
Akopalipsis - прежде чем настоятельно использовать фабрику, убедитесь - что она действительно нужна. Какой у вас случай?

Akopalipsis
14.10.2013, 00:42
in4core как всегда - в целях самообразования!)
Хотел спросить, что в ней такого.. Но сам догадался, что это для более больших проектов.
И у неё есть жуткий недостаток - не видно свойств возвращаемых классов.
Но вот её предназначение я наверное строчками выше занизил. Большими проектами я даже не грежу, но если рассматривать её как выдачу сюриализованных данных, то можно уже сейчас к ней привыкать.

caseyryan
14.10.2013, 08:18
в качестве ключа id, а в качестве значения константа.
Для чего там константа?

Котяра
14.10.2013, 11:25
сюриализованных данных
Ой, как здорово!

in4core
14.10.2013, 14:10
Котяра - в мемориз? ))))

Акопалипсис - не нужна вам фабрика вообще...

Akopalipsis
14.10.2013, 15:42
Акопалипсис - не нужна вам фабрика вообще...
Да! я уверен, что можно десять лет жить без знаний фабрики и не чего не случится, но когда нибудь наступит время и окажется, что я этого не знаю. Представляете если я через десять лет спрошу - а что такое фабрика и как её сделать?)
Для чего там константа?
я немного повременю с комментариями и спрошу вот что - когда я начал делать минимальный пример, чтобы на коде показать про что я говорю, то столкнулся с ранее неизвестной проблемой.
Если закомментировать getQualifiedClassName, то возникает ... не знаю как это назвать не ошибка, а падение плеера наверное ( как это называется? ). Почему так ?
package
{
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
public class Factory
{
public function create():void
{
//var name:String = getQualifiedClassName(Test);
var Create:Object = getDefinitionByName('test_package::Test') as Object;
}

}

}
Вот какое отношение закомментированная строчка имеет к следующей строчке?

Добавлено через 1 час 15 минут
Как то странно работает getDefinitionByName, зачем ему нужен импорт, если я ему ссылку даю..
public function create():void
{
var t:Test;
//var name:String = getQualifiedClassName(Test);
var Create:Class = getDefinitionByName('a_test::Test') as Class;
}

in4core
14.10.2013, 20:41
Представляете если я через десять лет спрошу - а что такое фабрика и как её сделать?)
Ну и что в этом такого? Ну не будете вы знать частицу песочницы и что? Вот если бы Вы через 10 лет изучения не понимали как работает цикл или как сделать кнопку - вот это было бы странно. Конечно я вам плохого советовать не хочу - читайте и разбирайтесь, это полезно. Но ставить вопрос - а что если?! - не советаю. Даже через 20 лет, у вас все равно будут возникать любой стороны глупые вопросы - это нормально, все знать невозможно.
Даже вот к примеру смешной пример, я могу на пальцах, на яблоках или еще на чем угодно , а так же с примерами объяснить, что такое полиморфизм , но вот четкого определения, как в школе, в жизни не знал :)

ххх:объясни мне пожалуйста доступным языком полиморфизм
ууу:короч смотри
ууу:у тебя есть класс коржик, от которого наследуются классы пирожено и морожено
ууу:у коржика есть метод схавать
ууу:но в пирожене он имплементируется как пожевать с чаем, а в морожене - полызькать
ууу:и вот у тебя пакет для коржиков. И ты туда наложила в перемешку пироженые и мороженые и тебе пофиг что ты от туда достанеш, ты вызываеш метод схавать. а уже реализация вызовется автоматом в зависимости от того что достанешь
ууу:вот это полиморфизм

gloomyBrain
14.10.2013, 21:15
Ага. "Полызькать".

"Один интерфейс, множество реализаций" - пожалуй, лучше подойдет как определение полиморфизма.

Akopalipsis
14.10.2013, 21:19
Ну и что в этом такого? Ну не будете вы знать частицу песочницы и что?
Мне почему то кажется, что это не правильно. Возможно я ошибаюсь, но пока я вижу фабрику, как
очень важный приём. И мне кажется, что время когда ты только учишься, самое подходящее для извращения всё, как например фабрика, от которой Вы меня немного хотели отстранить.

Добавлено через 1 минуту
И немного по теме - возможно как то узнать, есть ли в конструкторе класса параметры?

MikroAcse
14.10.2013, 22:38
И немного по теме - возможно как то узнать, есть ли в конструкторе класса параметры?
Нет. А зачем?

Akopalipsis
14.10.2013, 23:00
Нет. А зачем?
Статью gloomyBrain'а о обьектном пуле я хотел прочесть давно, но не знал что это называется пул. И вот из неё я подчеркнул то, о чем не когда не думал, а именно то что классы ведь нужно перезагружать, если они несут в себе параметры. Но вот с такой мыслью я и спросил о возможности узнавать есть ли вообще в конструкторе параметры.
И если я не ошибаюсь, то всё таки есть способ узнать о наличии параметров, но он уж слишком трудный.

Wolsh
14.10.2013, 23:36
Вы хотите сделать так, чтобы и Фабрика не знала классы, экземпляры которых будет создавать?
Новый паттерн "Китайская Фабрика"?
Чтобы класс вообще был в библиотеке, его хочешь не хочешь а надо упомянуть в коде. Класс, а не строку с его названием))
Есть конечно и методы с конфигом компиляции... ну не знаю, зачем так извращаться в данном случае.
Первое наивное что приходит на ум
public static const HERO:Class = game.characters.playable.Hero;
public static const TROLL:Class = game.characters.enemies.Troll;
// либо
public static const ENEMIES:Vector.<Class> = new <Class>[Troll, Wyvern, Ogre, Imp, Scamp, Zombie];
// либо
private static const ITEMS:Vector.<Class> = new <Class>[Sword, Shield, Boots, Bow, Spoon];
public static function getItemClass(id:uint):Class { return ITEMS[id]; }

Akopalipsis
15.10.2013, 00:04
Wolsh всё дело в том, что в моей голове сидят Ваши слова ...
Обычно это просто uint, например 0xFF12D6.
ID это константы.
... и ещё немного знаний, которые кричать о использовании вектора в качестве хранилища.
Вот вчера и сегодня пол дня ломал голову как совместить константы и вектор.
Но после половины сегодняшнего дня я отложил вектор и константы и скрепя зубами склонился пока в сторону медленного словаря. Не смог я вобщем придумать, как сделать название константы uint, а искать в векторе по строковому значению класс, Вы мне уже обьясняли что это глупо.
Но у меня вот в чём недопонимание - если делать так
public static const HERO:Class = game.characters.playable.Hero;
то нет возможности проверить на существование класса. Если так -
public static const ENEMIES:Vector.<Class> = new <Class>[Troll, Wyvern, Ogre, Imp, Scamp, Zombie];
то id будет 1,2 или 3, то есть не какое то супер индивидуальное. Но наверное надо понять, что по другому не как и остановиться на втором варианте.. Но тут опять нет уверенности, что класс там есть и можно запутаться. я параноик?)

Babylon
15.10.2013, 00:23
кто мешает добавить поле? id в любом случае не индекс, а идентификатор

Akopalipsis
15.10.2013, 00:30
кто мешает добавить поле? id в любом случае не индекс, а идентификатор
Babylon Спасибо! Наверное надо это за правило взять... я у многих видел свойство id в классах.

Babylon
15.10.2013, 00:32
вектор это упакованный однородный массив, dict лучше.Akopalipsis, вам учиться надо последовательно.Вы не изучив одно хватаетесь за другое. Что Вы только не спрашивали. Когда будем самостоятельными?

Akopalipsis
15.10.2013, 00:34
Что Вы только не спрашивали. Когда будем самостоятельными?
Ну не отвечайте тогда!)

Babylon
15.10.2013, 00:35
хорошо не буду!

Добавлено через 4 минуты
Ага. "Полызькать".

"Один интерфейс, множество реализаций" - пожалуй, лучше подойдет как определение полиморфизма.
Надо только иметь ввиду что фабрика может имплементировать сразу несколько интерфейсов. И это самое интересное.

Wolsh
15.10.2013, 01:00
Что-то Вы меня совсем запутали.
3 — "менее индивидуально" чем 0xFF12D6 ?
А в чем разница? И то и другое — целое число без знака.
Что такое "проверить на существование класса"? Не скомпилится без импорта класса, вот и вся проверка.
Как может не быть уверенности, если эта база классов — фундамент всей фабрики? Придется приложить некоторые усилия, да, чтобы хотя бы один класс был написан без ошибок))))
Вы создаете таблицу фабричных классов. Их соответствие номеру (ID) должно быть фиксированным раз и навсегда. Я не очень понимаю, как Вы представляли себе это по-другому? Как первый вариант (с HERO)? На каждый-каждый итем свою константу? Это же избыточно, и гарантии ни на йоту не больше.
Естественно, рабочий вид хранилища классов должен быть прокомментирован и спланирован. Надо распланировать диапазоны и оставлять пустые ячейки на вырост. Допустим, первые 50 ячеек предназначены для классов оружия, но реально заняты скажем 15, на остальные пока не хватает фантазии, заполняем их ссылкой на класс EmptyItem.
private static const ITEMS:Vector.<Class> = new <Class>
[
/* WEAPON 0x000000...0x000032 */
Sword, // 0x000000 - Short Rusted Iron Sword
BastardSword, // 0x000001 - Bastard Rusted Iron Sword
LongSword, // 0x000002 - Long Rusted Iron Sword
CurvedSword, // 0x000003 - Curved Sword
//...
EbonyBow, // 0x00000A - Long Ebony Bow
EmptyItem, // 0x000010
//....
EmptyItem, // 0x000032
/* FOOD 0x000033...0x000064 */
//...
];
А "проверять" уж Фабрика должна. Это, извините, она подписывает контракт на то что вернет по запросу экземпляр нужного интерфейса. Ей и проверять перед отдачей экземпляр на соответствие контракту, и выкидывать Еррор (в одном конкретном месте, что радует) в случае, если айдишник передали какой-то левый.

Babylon
15.10.2013, 01:04
я подозреваю, что константа это алиас числовому id :)

Akopalipsis
17.10.2013, 15:54
Wolsh Спасибо Вам за то что делитесь опытом, который
как мне кажется, получают находясь уже в команде. И за столь подробные обьяснения.
У меня к Вам ещё вопрос - чем вектор Class отличается от вектора Object?
Лично я разницу не как не могу уловить, но думаю, раз Вы так делаете, значит различия всё же есть.

in4core
17.10.2013, 17:50
public function Class extends Object - . Ведь все наследуется от object - это нижний уровень. В справке все указано.

Akopalipsis
17.10.2013, 17:54
Ведь все наследуется от object - это нижний уровень. В справке все указано.
Это я знаю, я не знаю почему пишут вектор классов, а не вектор обжектов.

Wolsh
17.10.2013, 18:49
Увы, я не понимаю вопроса.
А почему пишут вектор спрайтов а не вектор обжектов?
Пишут вектор Классов потому, что нужны Классы. Вектор обжектов это, простите, массив, с объектами неизвестного (любого) типа. А фабрике нужны Классы, экземпляры которых она будет производить. Зачем ей какие-то Обжекты? То есть, хотя бы пару слов скажите в защиту этой идеи, какие у нее достоинства, что Вас очаровали?

gloomyBrain
17.10.2013, 19:19
Про Class и Object:
Если провести аналогию, то есть понятие автомобиль и есть понятие Ferrari. Ferrari точно всегда является автомобилем, при этом автомобиль совсем не всегда является Ferrari. То есть автомобиль - общее понятие, Ferrari - более конкретное понятие.

То же и с взаимоотношениями Class <-> Object
Object - более общий тип
Class - более конкретный тип

Теперь про Vector:
Vector - параметризированный тип. То есть тип, зависящий от другого типа.
Vector.<Class> и Vector.<Object> - это разные типы данных. То есть - совсем разные. Примерно как "Автомобиль Ferrari" и "Автомобиль Лада".

Akopalipsis
17.10.2013, 19:28
Wolsh обычно думаешь, что чем больше узнаёшь, тем более типизировано всё размещаешь в голове и это тебе приносит внутреннее умиротворение. Но у меня не так, чем больше я узнаю читаю книги и чужие коды, тем больше у меня вопросов и это склоняет вот к таким вопросам.
Wolsh,gloomyBrain Спасибо что отвечаете на мои глупые вопросы. Пойду читать.

in4core
17.10.2013, 23:30
Akopalipsis - я вот не понимаю откуда ноги растут, вы целыми днями на этом форуме без передышки, когда читать и писать успеваете, что вопросы появляются? Или они появляются без прочтения и учения :)

Akopalipsis
17.10.2013, 23:43
in4core да вообще я целыми днями и читаю. Не выхожу с форума по тому как включаю комп я его уже не отключаю. Но так то я почти целый день сижу учу. Учу одно, а спрашиваю всё, что не понятно. Темы так раздуваются только из - за того, что я наверное не как Вы с рождения всё знаю и когда я вижу двух очень опытных и умных людей с разными подходами к одной и той же теме, то я не могу телепатически настроиться на них чтобы спросить. Вот с одной стороны ответ -
Пишут вектор Классов потому, что нужны Классы.
а с другой я в книгах и на гитхабе вижу приверженников Object, которые только на этом типе всё и пишут
( возможно они просто работают с сюреализованными данными.. Но опять самый верный подход, это спросить. А так как я почти целый день уже полгода не могу просто оторваться от изучения, то отдыхаю чтением форума и часто, глупыми вопросами.

Wolsh
18.10.2013, 00:17
Пока Вы разбирались с математикой, я за Вас не боялся — там по крайней мере все довольно однозначно и логично, и у каждой темы есть какие-то конечные границы. Но сейчас я должен Вас спросить: надеюсь, у Вас есть какой-нибудь планшет, чтобы писать нам приветы из психушки, куда Вы скоро попадете с таким рвением к обучению? Вы понимаете, что в программировании НЕТ конечных формул "вот так и никак иначе, доказано Аристотелем в таком-то году"? Всегда, по любому вопросу, Вы найдете десятки мнений и вариантов "решения". И все фигуранты будут по-своему, в чем-то, но правы. Потому что чаще всего нет никакого "единственно верного" решения. Особенно, когда Вы рассматриваете десятки совершенно разных проектов как решения одной абстракции. Абстракция не является основой для решения. Она только способ организации, инструмент, позволяющий разложить кучу объектов и их отношений по полочкам. Но Вы пытаетесь идти не от кучи, а от полочек. Вы берете шкафчик из химлаборатории с бирками на полках, и начинаете думать, как разложить там носки и майки из кучи конкретного проекта. А сейчас Вы дошли до края, когда пытаетесь придумать, по каким полкам разложить бирки с того лабораторного шкафчика. Пора остановиться. Невозможно же объять необъятное! У Вас же так коллапс мозга случится, а нас всех посадят.
Я просил Вас увлечься написанием конкретного кода, а Вас опять унесло в параллельные вселенные в поисках Высшей Мудрости, Божественной Гармонии и прочей Праджня-виджняны. Нам будет Вас не хватать. Мне уж точно.
Ищите решения в конкретном коде. Верным будет то, что будет полностью удовлетворять Вас. Решений море. Только Ваш собственный опыт может сказать, какое "правильно".

Akopalipsis
18.10.2013, 00:50
Wolsh если начать с математики, то я каждый раз Вас вспоминаю самыми добрыми словами, потому что без Вас я бы не осилил безье.
По завершению, я пристально изучил предложенные Вами мне цели и решил, что раз уж меня второй раз припирает тема с геоматом, то возьму ка я сразу и всё найду.
При чём хочу заметить, что "второй раз припирает" я сказал потому, что раз такое было в самом начале и тогда я решил, что пока плоховато понимаю код и свалив всё на это, ушёл от темы.
Тут подвернулась тема с треугольником, которую я думал решить за день, но затянулась она на месяц и я не капельки не жалею. И вот только - только я смог приблизится к решению половины всего невозможного в геометрии, как понял, что есть пробел в знаниях, я не знаю, как сделать простую вещь, смены единиц измерений ( градусы - радианы ). И тут как раз тема про MVC началась в которую я окунулся с целью - авось. Надеялся, что она поможет решить простую вещь. Но тут снова создали тему и Вы указали в ней о моём не понимании MVC и MVP и я полез учить шаблоны. Вот теперь я понимаю, как сделать смену систем, но оказалось, что с MVC тупичок. Сложно, особенно после того, как мне отказались помогать и я не кого не виню, зачем это кому нужно, да и возможно это не проффэтично, рассказывать, как они делают сейчас, когда их научили. И вот я пол дня ворчал...Но мне кажется, что я НАКОНЕЦ нашёл вот, ТО самое, что и искал. Сейчас сижу пробую. А вообще всё, за что я берусь и со стороны выглядит, как беспорядочных хаос, на самом деле, очень систематично и намерено.

Wolsh
18.10.2013, 01:30
мне отказались помогать и я не кого не виню ... да и возможно это не проффэтично, рассказывать, как они делают сейчас, когда их научилиУ меня такое ощущение, что никто просто не понял, о чем Вы спрашиваете. Если честно, это больше походило на галлюцинации. Какая-то жуткая смесь в одном из наследования, композиции, и зачем-то нетипизированных Обжектов; какого-то общего для всех фигурантов MVC абстрактного суперкласса... Лично я ничего не понял, как и в вопросе "используете слушателя или события?". Уж извините, ничего личного. Просто не поспеваю за Вашей мыслью. "О как высоко летает мой индейский брат".
без Вас я бы не осилил безьеНу, Безье Вы собственно и не осилили. Вы осилили рисование близкой к окружности кривой с помощью стандартного метода Графикс и при одном опредленном наборе входных условий)). Тема Безье намного, намного больше. И я Вам ничем не смог бы помочь, пойди Вы дальше. Но зато, благодаря Вам, я начал хоть маленько понимать векторы и наконец-то переписал свою рисовалку дуг окружности)) Правда, в результате я все-равно предпочел избавиться от класса Point в угоду Math, и несколько синусов и косинусов пришлось оставить, коль уж на входе задачи имеем углы. Однако все дальнейшее вычисление родилось из векторов, разложенных до простой математики, и этим я обязан Вам. Спасибо за вдохновение, сам бы я еще долго держал эту тему в дальнем ящике.

Akopalipsis
21.10.2013, 02:36
Если честно, это больше походило на галлюцинации.
Да нет же) Код с обжектами я сделал вдохновлённый книгой, которую Вы тоже упомянули.
Там так написано))) Вот если такие недоразумения будут, Вы говорите. А то сами подумайте,
я прочел книгу, показал и тишина, я даже не подозревал, что так не надо.
Ну, Безье Вы собственно и не осилили.
Обязательно осилю!