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

FinalBoss 30.06.2011 16:54

Типизированный массив, расширяющийся при необходимости
 
Всем привет.

У меня есть массив одинаковых объектов, к примеру 10 мувиклипов, а мне нужно разместить на экране 15 таких мувиков из этого массива. Для этого нужно заполнить этот массив ещё 5 объектами этого же типа.
Т.е нужно создать такую функцию, которая расширяла бы указанный массив, нужным типом данных ... понятно что можно внутри такой функции реализовать switch в котором будут указаны все типы, но может есть способ поэлегантнее? чтобы при появлении нового класса не надо было добавлять соответсвующий case ? Либо может как-то расширить класс Array или Vector так чтобы его можно было влюбой момент дополнить?

Спасибо!

bav 30.06.2011 16:57

По-моему в Array и так можно когда и куда угодно добавлять что угодно.

kackbip 30.06.2011 16:58

вроде есть метод один... getQualifiedClassName... вроде называется.
В параметры принимает объект.
Получаете имя класса, потом получаете сам класс: getDefinitionByName
Потом создаете экземпляры
---
если я правильно понял, что нужно автору

FinalBoss 30.06.2011 17:10

Цитата:

Сообщение от bav (Сообщение 1007725)
По-моему в Array и так можно когда и куда угодно добавлять что угодно.

Скажу иначе, у меня есть 2 типизированых массива

Код AS1/AS2:

var A:Vector.<Sprite> = new Vector.<Sprite>();
var B:Vector.<Object> = new Vector.<Object>();

мне нужно дополнить ещё тремя и пятью элементами оба массива, для этого я хочу использовать функцию вроде этой:

Код AS1/AS2:

A.add(3);
B.add(5);

Т.е функция add возьмет на себя работу определения нужного типа элементов и добавит нужное их число в массив.
Ну или в более простом виде реализовать, типа как-нить так:

Код AS1/AS2:

AddElementsTo(A, 3, Sprite);
AddElementsTo(B, 5, Object);


kackbip 30.06.2011 17:13

Да, вы можете это реализовать с помощью того, что я описал выше.

FinalBoss 30.06.2011 17:51

Цитата:

Сообщение от kackbip (Сообщение 1007730)
Да, вы можете это реализовать с помощью того, что я описал выше.

Да, все получилось, спасибо!
Состряпал тут для наглядности, может ещё кому пригодится:

Код AS1/AS2:

import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.display.MovieClip;
 
var AArray:Array = new Array();
var BArray:Array = new Array();
 
function AddElementsTo(A:Array, num:int, NeedClass:String):void {
        for (var i:int = 0; i < num; i++) {
                var someClass:Class = getDefinitionByName(NeedClass) as Class;
                A.push(new someClass());       
        }
}
 
function AddElementsTo2(A:Array, num:int, NeedClass:*):void {
        var nameClass:String = getQualifiedClassName(NeedClass) as String;
        trace(nameClass);
        for (var i:int = 0; i < num; i++) {
                var someClass:Class = getDefinitionByName(nameClass.toString()) as Class;
                A.push(new someClass());       
        }
}
 
AddElementsTo(AArray, 3, "flash.display.Sprite"); // указываем нужный класс
AddElementsTo2(BArray, 5, AArray[1]); // реализация, где просто даем ссылку на экземпляр нужного класса
 
trace(AArray + "\n" + BArray);
 
//результат
[object Sprite],[object Sprite],[object Sprite]
[object Sprite],[object Sprite],[object Sprite],[object Sprite],[object Sprite]

Ну похоже тема закрыта

alatar 30.06.2011 18:17

Если вам, на этапе компиляции, известен класс который необходимо создать, то все эти танцы с бубном getQualifiedClassName не нужны. Передавайте в функцию сразу необходимый класс.
Код AS3:

function AddElementsTo2(A:Array, num:int, NeedClass:Class):void {
        for (var i:int = 0; i < num; i++) {
                A.push(new NeedClass());       
        }
}
...
AddElementsTo(AArray, 3, Sprite);


-De- 30.06.2011 18:21

А вам есть разница, писать
Код AS3:

AddElementsTo(AArray, 3, Sprite);

или
Код AS3:

AddElementsTo(AArray, 3, "flash.display.Sprite");

?
в первом случае всё намного легче и быстрее, new NeedClass и всё). Для второго советую вместо
Код AS3:

getDefinitionByName(getQualifiedClassName(NeedClass))

(зачем, кстати, строку эту тягать весь цикл и кучу раз getDefinitionByName дёргать?)
Код AS3:

(NeedClass as Object).constructor

- нет мороки со строками, строки это не особо быстро всегда. Ну и вообще информацию о типах использовать не рекомендуют.

goodguy 30.06.2011 20:15

Может я что-то не понял, но не лучше ли в таком случае использовать Array?
Зачем тут Vector вообще?
По-моему, все преимущества в скорости будут сведены на нет подобной хренью getDefinitionByName(getQualifiedClassName(NeedClass))

Crazy 30.06.2011 20:27

...тем более, что штатно это делается передачей параметром не имени класса или самого класса, а объекта-фабрики. Что и быстрее и гибче.

Изучаем паттерн Abstract Factory и будет счастье.


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

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