Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обобщение типизированных массивов (Vector) (http://www.flasher.ru/forum/showthread.php?t=145726)

koIIImarik 17.10.2010 21:07

Обобщение типизированных массивов (Vector)
 
Всем привет, возник следующий вопрос.

Допустим, мне хотелось бы сделать какую-то простую вспомогательную функцию, которая бы упрощала процесс удаления объекта из массива. Если мы работаем с Array, то всё решается следующим образом:

Код AS3:

/**
 * Удаление объекта, если он присутсвует в массиве.
 *
 * @param        obj объект, который нужно будет удалить.
 * @param        array массив, из которого нужно будет удалить обект.
 *
 * @return        флаг, который показывает, был ли удалён объект.
 */

static public function removeObjFromArray(obj:*, array:Array):Boolean
{
  var isRemoved:Boolean = false;
 
  var index:int = array.indexOf(obj);
  if (index >= 0)
  {
    array.splice(index, 1);
    isRemoved = true;
  }
 
  return isRemoved;
}

Если мне захочется то же самое сделать для типизированных массивов (Vector), то меня ждёт небольшое разочарование:

Код AS3:

/**
 * Удаление объекта, если он присутсвует в типизированном массиве.
 *
 * @param        obj объект, который нужно будет удалить.
 * @param        vec типизированный массив, из которого нужно будет удалить обект.
 *
 * @return        флаг, который показывает, был ли удалён объект.
 */

static public function removeObjFromVector(obj:*, vec:Vector.<*>):Boolean
{
  var isRemoved:Boolean = false;
 
  var index:int = vec.indexOf(obj);
  if (index >= 0)
  {
    vec.splice(index, 1);
    isRemoved = true;
  }
 
  return isRemoved;
}

Так, данная функция не позволяет использовать её для любого из видов объектов Vector. Например следующий код вызовет ошибку (будем считать, что нужная нам функция является статической функцией класса ArrayTools):

Код AS3:

var vec:Vector.<int> = new Vector.<int>();
vec.push(0);
vec.push(1);
vec.push(2);
ArrayTools.removeObjFromVector(1, vec);

Текст ошибки: Error: Implicit coercion of a value of type __AS3__.vec:Vector.<int> to an unrelated type __AS3__.vec:Vector.<*>.


В то время, как такой код никакой ошибки не выдаст:

Код AS3:

var vec:Vector.<*> = new Vector.<*>();
vec.push(0);
vec.push(1);
vec.push(2);
ArrayTools.removeObjFromVector(1, vec);

Понятно, что всё дело в различии типов int и *, но, хотелось бы узнать, может быть есть какой-то способ сделать так, чтобы можно было работать с общими для всех объектов Vector методами, не переписывая каждую функцию под отдельный Vector.

За ранее спасибо за помощь =)

i.o. 17.10.2010 21:10

А если написать без указания типа, т.е:
Код AS3:

static public function removeObjFromVector( obj:*, vec:Vector ):Boolean

Попробуйте и отпишитесь

КорДум 17.10.2010 21:14

Можно же вместо * вставить Class. Нет?

i.o. 17.10.2010 21:16

нет. Тогда вектор Class'ов будет.

КорДум 17.10.2010 21:20

А, ну да. Тогда только "*".

f.g.programmer 17.10.2010 21:28

Там ошибка выскакивает уже при компиляции, т.е. Vector.<*> и Vector.<int> считаются абсолютно разными типами.

Можно сделать так
Код AS3:

static public function removeObjFromVector(obj:*, vec:*):Boolean

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

Psycho Tiger 18.10.2010 17:47

По сути на сишном синтаксисе это int vec[] или void vec[]. На си такая проблема решается темплейтами, свои темплейты в ас3 писать, к сожалению, нельзя.

koIIImarik 18.10.2010 23:47

2 i.o.:
Пробовал, не помогало =(

2 f.g.programmer:
Спасибо большое за идею =) Как-то не пришло это просто в голову.


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

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