Вопрос по поводу ООП и областей видимости.

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Ответить
soundy_flash
Сообщения: 2
Зарегистрирован: 27 сен 2012, 16:15

Вопрос по поводу ООП и областей видимости.

Сообщение soundy_flash »

Здравствуйте, друзья!

Уже довольно давно сижу на сайте, читаю форум. А сейчас я изучаю книгу Колина Мука по языку actionscript 3.0. И вот у меня впервые возник вопрос к более опытным товарищам.

В книге на странице 915 приведён следующий код (перепечатываю без комментариев от автора):

Код: Выделить всё

package {    import flash.display.MovieClip;    import flash.utils.Timer;    import flash.events.TimerEvent;     public class Star extends MovieClip {        private var timer:Timer;         public function Star() {            timer = new Timer(100, 0);            timer.addEventListener(TimerEvent.TIMER, timerListener);            timer.start();        }         private function timerListener(e:TimerEvent) {            randomFade();        }         private function randomFade():void {            alpha = Math.random();        }         public function dospose():void {            timer.stop();        }    }}
Меня интересуют строки с 9 по 21. Поподробнее объясню область своего незнания :)

Программа каждые 50 миллисекунд меняет значения прозрачности для каждой конкретной звезды отдельно. =>
Функция-приёмник "timerListener()" зарегистрирована в объекте Timer данного экземпляра класса Star. =>
У объекта события, передаваемого в функцию, есть переменная экземпляра "target", которая указывает на объект Timer. =>
Функция-приёмник не знает, таймер какого именно экземпляра класса Star вызвал эту функцию. =>
Почему тогда переменная alpha из функции randomFade() знает, для какой именно звезды (экземпляра класса Star) менять степень прозрачности?

Сейчас, во время написания текста, у меня появилась догадка, что функция randomFade, это метод экземпляра, а значит она как-то должна знать, таймер какого именно экземпляра привёл к её вызову. Но это только догадка.

Чтобы у меня в голове не возникло непоправимых пробелов в знаниях, разъясните мне пожалуйста поподробнее, что здесь да как. В чём фишка? Почему переменная alpha меняется именно для того экземпляра, таймер которого привел к вызову функции, меняющей эту переменную?
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Вопрос по поводу ООП и областей видимости.

Сообщение sanych_dv »

Добавьте ключевое слово this и вам станет все понятно:

Код: Выделить всё

         private function timerListener(e:TimerEvent):void        {            randomFade();                        trace(timer.currentCount, this.timer.currentCount);                }                private function randomFade():void        {            alpha = Math.random();                        trace(this, alpha, this.alpha)                } 
В контексте данного класса выражения timer = new Timer(); и this.timer = new Timer(); будут эквивалентны.
Таким образом, при создании каждого экземпляра класса Star поведение вызванного из него объекта Timer будет определяться только в границах этого экземпляра Star.

В ActionScript 3 именованная функция с закрытием метода всегда будет ссылаться на экземпляр объекта оригинального контекста определения функции.
soundy_flash
Сообщения: 2
Зарегистрирован: 27 сен 2012, 16:15

Re: Вопрос по поводу ООП и областей видимости.

Сообщение soundy_flash »

sanych_dv, спасибо. С вашей (и не только) помощью я разобрался в своём вопросе.
Ответить