проблема доступа к нестатическим функциям из статических функций в AS3 - PullRequest
0 голосов
/ 05 июня 2010

У меня есть класс, содержащий, помимо прочего, выпадающее меню. С целью экономии места, и так как содержимое меню никогда не изменится, я сделал статический DataProvider для всего класса, который заполняет меню каждого экземпляра. Я надеялся заполнить список реальными функциями, такими как:

tmpArr.push({label:"Details...", funct:openDetailsMenu, args:""});

и затем назначьте tmpArr для DataProvider. Поскольку DataProvider является статическим, функция, содержащая этот код, также должна быть статической, но функции в массиве не являются статичными. Сначала это не казалось проблемой, потому что когда пользователь нажимает на элемент меню, раскрывающееся меню может вызывать нестатическую «executeFunction (funct, args)» для своего родителя. Однако, когда я пытаюсь скомпилировать статическую функцию, настраивая DataProvider, он не может найти передаваемые нестатические функции. Если бы компилятор просто поверил мне, код работал бы отлично!

Простое решение состоит в том, чтобы просто передавать строки и использовать оператор switch для вызова функций, основанных на этом, но это большой, некрасивый, не элегантный и сложный в обслуживании, особенно если что-то наследуется от этого класса. Более простое решение - просто сделать DataProvider нестатичным, но мне интересно, есть ли у кого-нибудь еще хороший способ справиться с этим? Сделать статическую функцию способной видеть своих нестатических собратьев?

Спасибо.

Ответы [ 2 ]

1 голос
/ 07 июня 2010

ОК, основная причина для того, чтобы сделать вещи статичными, заключается в том, что если вы хотите сделать его независимым от экземпляра, например, для математических функций в as3 (вы вызываете Math.min (), а не var math = new Math (); math.min () ...) это полезно для справки, повторного расчета, простых действий (добавьте 10 к значению x) и т. д.

проблема с объединением статической и нестатической функциональности заключается в том, что при вызове статической функции существует вероятность того, что класс не имеет экземпляра в этой точке, или (в этом случае) имеется какая-либо ссылка на функцию, которая бы имеет смысл в компиляции (если отдельный класс называется функцией, как он будет ссылаться на openDetailsMenu?).

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

public static function doAction(object:Menu, event:String){
    if(event == "details") object.openDetailsMenu() ;
}

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

0 голосов
/ 12 июня 2010

вы можете просто сохранить статическую ссылку на экземпляр, в данном случае _instance. (Вроде как в гетто-синглтоне) просто будьте осторожны, чтобы не вызывать статический метод до создания экземпляра класса.

/// in your constructor define a static reference handle to the instance
public function ClassName(){
   _instance = this;
}

public static function doSomethingStatic(){
   var varValue = ClassName._instance.someInstanceVariable;
}
...