Цитата:
Сообщение от goodguy
Не представляю, где это может понадобиться в реальности
|
Представьте: Есть неск-ко функций, использующих определенный набор объектов(переменных). Функции связаны, управляющий элемент ходит туда-сюда по этим функциям. Внутри функций по мере надобности инициализируются некоторые из объектов(переменных):

Код AS3:
function foo1(){
var1 = new var1Class();
var2 = new var2Class();
}
function foo2(){
var2 = new var2Class();
}
Чтобы в памяти не плодить кучи новых объектов, рационально их использовать повторно. То есть если объект уже получил значение, то его заново не создаем, а просто меняем необходимые свойства:

Код AS3:
function foo2(){
if(!var2) = new var2Class();
}
Вот на этом месте я задал себе вопрос - я что в каждой подобной
foo№() должен такие проверки проводить? Не красиво и громоздко получается. Ладно, если будет одна точка входа в систему функций, там получится, что в любой момент времени известно, какие объекты созданы, и можно ручками написать такие проверки, сведя их к минимуму. А если точек входа несколько?
Цитата:
|
но у меня вопрос, зачем создавать "пустую" переменную какого-то определенного типа?
|
Пустые переменные - это еще не получившие значения поля класса, которые свои значения получают в функциях, пример выше.
Тут конечно можно сказать, мол сразу давай всем своим переменным значения и не мучайся. Но зачем мне иметь эти переменные тогда, когда они фактические еще нигде не используются?
Вот и чтобы избавится от копипаста одинаковых проверок, решено было вынести подобный алгоритм в отдельную функцию, которая(спасибо за инфу о нужных функциях) примерно выглядит вот так:

Код AS3:
function checkObj(...objs):void
{
for(var i:int = 0; i < objs.length; i++)
{
if(!objs[i])
{
assetClass = getDefinitionByName(getQualifiedClassName(obj[i])) as Class;
objs[i] = new assetClass();
}
}
}
Тут можно улыбнуться и расслабиться, но:

Код AS3:
import flash.display.Sprite;
var assetClass:Class;
var spr1:Sprite = new Sprite();
var spr2:Sprite;
assetClass = getDefinitionByName(getQualifiedClassName(spr1)) as Class;
trace(assetClass);
// [class Sprite]
// А если так:
assetClass = getDefinitionByName(getQualifiedClassName(spr2)) as Class;
// ReferenceError: Error #1065: Переменная null не определена.
Итог - переменная
null в рамках такого алгоритма не то, чтобы получить значение не может. Даже считать из нее ссылку на класс нельзя. А значит я либо ничего не понял, либо придется оставить наполеоновские планы и решать проблему "в лоб". Мб кто-то с подобным сталкивался и подскажет, что тут еще можно сделать.