PDA

Просмотр полной версии : Статическая переменная - член класса


alexxus
06.05.2012, 01:36
Доброго времени суток. Нуждаюсь в совете знатоков. Для Flash AS3 приложения необходимо было создать окно-сообщение. Под это дело написал класс CMessageBox
Т.к. сообщение может вызываться из любых классов программы, то очень напрягало создавать в каждом классе переменную-член CMessageBox. я создал статический массив в классе CMessageBox, элементами которого являются члены класса CMessageBox. Вот краткий листинг:

//-------------------------------------------------------------------------
public class CMessageBox extends MovieClip {

private static var app:Stage;//ссылка на родитель-контейнер
private static var mList:Array = new Array();//список созданных окон
private static var idCounter:int =0;//счетчик созданных окон, как уникальный id

//---------------------------------------------------------------------
//Указываем родителя на этапи инициализации приложения---------------
public static function setStage(obj:Stage):void {
app = obj;
}
//---------------------------------------------------------------------
// Создать окно--------------------------------------------------------
//---------------------------------------------------------------------
public static function showMessage(mess:String):void {

if(app!=null)
{
mList.push(new CMessageBox(mess));
}else
trace("Не указано родительское окно!");
}

//конструктор----------------------------------------------------------
public function CMessageBox(mess:String) {

idCounter ++;
this.name = "mess"+ idCounter.toString();
bClose.addEventListener(MouseEvent.CLICK, onCloseClick);

this.txt.text = mess;

//отображаем------------
app.addChild(this);

}

//---------------------------------------------------------------------
private function onCloseClick(e:MouseEvent):void {

bClose.removeEventListener(MouseEvent.CLICK, onCloseClick);

if(this.parent)
this.parent.removeChild(this);

deleteMessage(this.name);
}
// Удалить окно--------------------------------------------------------
private static function deleteMessage(pName:String):int {

for(var i:int=0; i< mList.length;i++)
{
if( CMessageBox(mList[i]).name == pName )
mList.splice(i,1);
return 1;
}
return 0;
}
//------------------------------------------------------------------------
}

По-поводу алгоритма удаления - можно также было использовать app.getChildByName, либо использовать ассоциативный массив, не суть. Данная реализация мне приглянулась весьма удобной, но у меня есть сомнения по-поводу очистки памяти. Если какой-нибудь объект массива не будет принудительно заNullен, он заторчит в памяти? Как GC работает со статическими переменными? Вообще - разумна ли такая реализация?
В данном примере сообщения удаляются по закрытию, и вроде как все под контролем. Но руки чешутся использовать такой подход в других вопросах. Например, есть класс NPC, хочу в этот же класс влепить статический список членов этого класса, т.к. члены NPC тесно взаимодействуют с другими членами этоого же класса...
Много думал, писал под пиво... спасибо за внимание, жду ваших ответов и рекомендаций.

-De-
06.05.2012, 01:53
Как для MessageBox - нормальное решение, сам делал подобное (только у меня была очередь сообщений). Статически привязанные обьекты GC не съест, потому как до них можно достучаться, следовательно на них есть ссылка. Т.е. надо быть уверенным, что не закрыть это окно невозможно.
Что попало делать статикой - не стоит. Только если оно сильно отдельно от остального сидит. NPC явно не должны сидеть в статическом массиве, они относятся к текущему "уровню" (даже если он один и не то чтобы уровень).

alexxus
06.05.2012, 02:18
Спасибо за ответ. Учту.
А вот по поводу работы со списком NPС, сразу не уточнил. Класс NPC - базовый (интерфейс?), с двумя наследниками: NPCHight и NPCLow. Причем, NPCHight содержит "ссылки" на определенные( может манипулировать) NPCLow.
Создал для этого класс NPCList с соотв. параметром ассоциативным списком NPC. В нем реализую взаимодействие между членами NPC. И получается какая-то каша. Некоторые методы, например NPCHight должен "покормить" своих NPCLow, явно просятся в класс NPCHight. Но из-за работы с другими членами NPC никак туда не укладываются. В общем что-то я в явном ступоре, настроение никак не Победное...