2013-08-07 3 views
0

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

public class MyClass{ 

    public var variable:String = ""; 

    public function MyClass(){} 

    public function myFunction():void{ 
     this.variable = "BLORE"; 
    } 
} 

и у меня есть куча из них:

var class1:MyClass = new MyClass(); 
var class2:MyClass = new MyClass(); 

есть способ, которым я могу позвонить MyClass.myFunction() и он призвал все мои случаи?

Я не знаю, объясняю ли я это хорошо ... но вот оно. Мне бы хотелось, чтобы у вас были какие-то предложения, которые не просто включают «помещать ваши экземпляры в массив или вектор и прокладывать через них, как настоящий человек».

+1

Если все, что вы хотите, чтобы установить переменную во всех случаях (как ваш пример делает), используйте 'static' переменную. Но я думаю, вы хотите что-то более активное? – frankhermes

+0

Да, я хотел бы иметь возможность изменять визуальное состояние каждого экземпляра (альфа, x и т. Д.) С помощью одного глобального вызова. Статик не работал бы для меня в этой ситуации. :( – onekidney

+0

Итак, вы хотите установить определенную переменную (альфа, x, y и т. Д.) Для всех классов одновременно одним звонком? – putvande

ответ

1

Вот краткий пример того, как это сделать:

package { 
    public class Example { 
     public static var instances:Array; 

     public function Example() { 
      if (!instances) { 
       instances = []; 
      } 
      instances.push(this); 
     } 

     public static function setPropertyOnAll(property:String, value:Object):void { 
      var l:uint = instances.length; 
      for (var i:uint = 0; i < l; i++) { 
       instances[i][property] = value; 
      } 
     } 
    } 
} 

В принципе, у вас есть статический массив в пределах своего класса, и вы толкаете каждый экземпляр этого класса в массив при конкретизации. Затем вы просто просматриваете массив и изменяете свойство.

Имейте в виду несколько вещей:

  • Там нет обработки, если property не существует ошибка. Поэтому убедитесь, что свойство, которое вы передаете в setPropertyOnAll, на самом деле является собственностью или вы добавляете некоторую проверку ошибок, чтобы быть уверенным.
  • Сохранение каждого экземпляра в массив сделает их непригодными для сбора мусора. Очевидно, это очень плохо. Если вы это сделаете, вы захотите создать способ удалить каждый экземпляр из массива, даже если это нужно делать вручную каждый раз. Я не делал этого, потому что невозможно узнать, как/когда его запускать или как выглядит ваша структура класса, поэтому вам нужно что-то выяснить. Вы не хотите, чтобы держать их неподходящими для сбора мусора
+0

Хорошо, это здорово. Поэтому мы не можем отходить от проблемы «looping through a array», но это похоже на действительно хороший способ справиться с этим. Спасибо! – onekidney

+0

Да, к сожалению, нет никакого реального пути. Вы должны получить доступ ко всем этим способом, и цикл - единственный способ сделать это. Если массив не гигантский, у вас не должно быть проблем со скоростью. Говоря об этом, вы должны использовать Vector в этом случае для 'экземпляров' вместо Array. –

1

Это так же просто, как с помощью функции static, которая использует staticArray со ссылками на все экземпляры этого класса.

Каждый раз, когда вы вызываете конструктор класса, чтобы создать новый экземпляр, вам нужно добавить ссылку экземпляра в Тогда ваш static функции Array

arrayOfInstances.push(this); 

будет цикл массив и делать все, что вам нужно.

Не забудьте добавить статический метод для удаления всех ссылок в Array, чтобы сборщик мусора мог очищать эти объекты из памяти.

+0

Это замечательно, спасибо за ответ! – onekidney

+0

Итак, вы приняли ответ Джоша, потому что он отправил код (делая то, что я сказал первым)? – Pier

+0

Hi Pier - извините, я имею в виду не обиду. Когда я проверил вас, вы оба ответили, и ответ Джоша был более полным ответом IMO, поэтому я выбрал его. – onekidney

Смежные вопросы