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

1q2w3e4r5t6 14.07.2011 18:30

Вызов метода объекта, находящегося в массиве
 
Добрый день,
столкнулся с неожиданной проблемой: не знаю, как вызвать метод из объекта, который находится в массиве. В AS3 в массиве можно держать переменные любых типов в отличии от с++. А посему инструкция someArray[i].myMethod() не годится здесь. Подскажите как?

PS ну например создал массив, в него запихнул 10 спрайтов. Далее где-то в программе в цикле потребовалось для каждого обеъекта из массива, например, вызвать метод beginfill(color, alpha). Как?

Bgg 14.07.2011 18:34

Почему не годится someArray[i].myMethod() ?

Jewelz 14.07.2011 18:41

Цитата:

Сообщение от 1q2w3e4r5t6 (Сообщение 1011713)
инструкция someArray[i].myMethod() не годится

она не годится только если в массиве предполагается держать еще и другие типы

DaFive 14.07.2011 18:43

Проверить на тип объекта в массиве и вызывать нужный метод в зависимости от типа. typeof (для простых), is.

1q2w3e4r5t6 14.07.2011 18:45

Предположим: someArray = [a:myObj, b:myObj, c:int, d:Sprite];
Вызываем:
someArray[0].myMethod() //Круто!
someArray[1].myMethod() //Круто!
someArray[2].myMethod() //Бред...
someArray[3].myMethod() //Бред...
К тому же ставя точку (.) в списке доступных свойств моего метода нет.

DaFive 14.07.2011 18:49

Код AS3:

import flash.display.Sprite;
 
var someArray = [{}, {}, 0, new Sprite()];
 
trace(someArray[0] is Object);
trace(someArray[1] is Object);
trace(someArray[2] is int);
trace(someArray[3] is int);

true
true
true
false

Bgg 14.07.2011 18:55

а, да. Можно ещё проверять наличие метода:
Код AS3:

if(someArray[i].hasOwnProperty("myMethod"){
  someArray[i].myMethod();
}


DaFive 14.07.2011 18:56

Цитата:

Сообщение от 1q2w3e4r5t6 (Сообщение 1011724)
К тому же ставя точку (.) в списке доступных свойств моего метода нет.

Это уже может быть косяк редактора кода. Видишь суслика? ... а он есть.

etc 14.07.2011 19:07

DaFive, ни одни из редакторов такое не предсказывает для Array.

DaFive 14.07.2011 19:12

Ну если к типу не привести, то да.
я почему-то подумал не для элемента массива, а к объекту.

silin 14.07.2011 19:21

>>ни одни из редакторов такое не предсказывает для Array.
FD если массив объявлен как var arr:Array/*Sprite*/; показывает весь арсенал Sprite для arr[1].|

Bgg 14.07.2011 19:31

Цитата:

Сообщение от silin (Сообщение 1011739)
>>ни одни из редакторов такое не предсказывает для Array.
FD если массив объявлен как var arr:Array/*Sprite*/; показывает весь арсенал Sprite для arr[1].|

Это только в FD4?

1q2w3e4r5t6 14.07.2011 19:35

Всем спасибо за ответы!

Jewelz 14.07.2011 19:37

> Это только в FD4?
нет

fish_r 14.07.2011 19:50

Тут, может быть, удобнее не проверку типа использовать, а приведение к типу (если вы уверенны, что не спутаете объект), например:
Код AS3:

  ...
  MyObject(myArray[i]).someMethod();


1q2w3e4r5t6 14.07.2011 19:53

Уже сделал myArray[i].someMethod(). У меня в массив добавляются исключительно объекты одного типа.

Bgg 14.07.2011 20:02

Цитата:

Сообщение от Jewelz (Сообщение 1011746)
> Это только в FD4?
нет

Да, точно, после импорта Sprite все заработало.

silin 14.07.2011 20:39

> Это только в FD4?
это у них чуть ли не с FD2, еще с mtasc'их времен
еще такая же плюшка есть для Proxy (class MyString extends Proxy /*String*/)
и в FD4 еще для анонимных функций (var callback:Function/*(x:Number, s:String):void*/)

Nooob 15.07.2011 01:09

Может лучше юзать вектор для строгой типизации элементов? и не вставлять туда элементы разного типа.


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

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