Показать сообщение отдельно
Старый 23.10.2012, 21:25
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 1  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Attention Странная разница между публичным полем и сеттером / геттером

Сейчас писал интерактивную обучалку к игре, и наткнулся на одну очень неприятную особенность, которая украла у меня несколько часов жизни ). Больше похожую на баг в ас3. В общем, не знаю баг это или нет, но суть в следующем. Есть некий класс TrainingStep, который в упрощенном виде выглядит примерно так (в очень упрощенном виде):
Код AS3:
package training {
     public class TrainingStep {
            public var targetDo:Sprite = null; 
            public var finished:Boolean = false;
     }
}
Этих этапов может быть сколько угодно. Так вот, при их создании, если этап обучения предполагает щелчок по какомму-то спрайту, или его наследнику, то при создании этапа, переменной targetDo присваиватеся ссылка на этот объект.
Далее этап помещается в массив. И в другой функции, по энтерфрейму проверяется весь массив до первого не пройденного этапа. И вот тут то начинаются странности, которые не поддаются моей логике.

Если используется публичная переменная targetDo, то в цикле, при проверке ссылки на ней, вылетит обращение к объекту null.
Если же, изменить ее на приватную, для назначения использовать сеттер, а для получения геттер, то все нормально.
Код AS3:
package training {
     public class TrainingStep {
            private var _targetDo:Sprite = null; 
            public var finished:Boolean = false;
 
            public function set targetDo(value:Sprite):void {
                    _targetDo = value;
            }
            public function get targetDo():Sprite {
                   return _targetDo;
            }
     }
}
Вот так будет все замечательно.

И вот отсюда вытекает вопрос, как так? Публичная переменная не может хранить ссылку на дисплей объект?
Или это действительно баг в языке?