2014-11-05 2 views
0

В настоящее время я участвую в использовании отдельных файлов и классов .as, но после прочтения много всего, похоже, отличается от того, что я читал. Я отправляю этот вопрос с целью обучения, а не только для того, чтобы код работал. Примеры здесь - это проверенные, упрощенные рецензии на мой настоящий проект.Почему мои файлы классов AS3 работают не в порядке?

Мой файл «MyApp.fla» имеет 1 кадр с формой в качестве фона, для параметра DocumentClass установлено значение «MyApp». библиотека имеет символ "Page1" 1 кадра с другим фоном формы, с его установкой класса "Page1"

MyApp.as:

package { 

    trace("1: DocumentClass file, before class"); 
    import flash.display.MovieClip; 

    public class MyApp extends MovieClip { 

     trace("2: DocumentClass file, in the class") 
     public var setting1:int = 2; //this is a variable which i want to be accesible to other classes, so to the pages being loaded 
     private var currentPage:MovieClip; //I wanted to create this var in the constructor, but I'm afraid something will explode again :< 

     public function MyApp() { 
      trace("3: DocumentClass file, in constructor function"); 
      currentPage = new Page1; 
      addChild(currentPage); 
     } 
    } 

} 

Page1.as:

package { 

    trace("4: Page1 file, before class"); 
    import flash.display.MovieClip; 

    public class Page1 extends MovieClip { 

     trace("5: Page1 file, in class, before constructor"); 


     public function Page1() { 
      trace("6: Page1 file, in constructor") 
      trace(setting1) //According to everything i read this should work since setting1 is public, but it gives me: "1120 Acces of undefined property setting1" so i commented this out for the output. 
      trace(root); 
      trace(stage); //both trace null since i haven't used addChild() yet, but now i dont know how to try to reference my variables through the main timeline. 
     } 
    } 

} 

Выход:

  • 5: Стр.1 файл, в классе перед конструктором
  • 4: Стр.1 файл, перед классом
  • 2: DocumentClass файла, в классе
  • 1: DocumentClass файл, перед классом
  • 3: DocumentClass файла, в конструктор функции
  • 6: Page1 файл, в конструктор
  • нуль
  • нуль

в то время как фон формирует экран, как ожидается, генерируемый вывод полностью выходит из строя из что я ожидал. Мой главный вопрос: Почему мои следы не заказываются 1 -6?

Мой следующий вопрос: Почему конструктор Page1() не ссылается на public var setting1?, я предполагаю, что могу обойтись, передав параметр1 в качестве аргумента в конструктор Page1(), но я избегаю этого в целях обучения.

ответ

5

параметр1 является переменной в родительском объекте, а не объектом, из которого вы пытаетесь его вызвать. Это просто не работает.

trace(this.parent.setting1); 
trace(MovieClip(parent).setting1); 

Замена его с одним из описанных выше должна работать, как вы бы называть переменную форму, где он ссылается, который является родителем.

Причина заказа:

5 - the class itself is imported before anything else 
4 - while the class loads, it checks for additional imports 
2 - after it finished importing all classes, it loads its own class 
1 - again, while the class loads it check for imports 
3 - after everything is loaded, it's free to run the main function of the class 
6 - same as 3, but the child always walks behind the parent 

запомнить в объектно-ориентированное программирование, он должен загрузить все объекты (или классы), прежде чем он пытается сделать что-нибудь с ними. Представьте, если subclass.as имел переменную и class.as пытался получить к ней доступ до ее загрузки.

Надеюсь, что это поможет :). Если вам нужна дополнительная информация, не стесняйтесь спрашивать, я просто подытожил каждый шаг.

+0

изменение трассы с помощью this.parent дает ошибку компиляции 1119: доступ к возможно неопределенной настройке свойств1 через ссылку со статическим типом flash.display: DisplayObjectContainer. Я думал, что мой класс Document будет работать так, как если бы это был код на MainTimeline или, точнее, создавал MovieClip в месте MainTimeline и вставлял код конструктора в его фрейм, чтобы говорить и запускать его. И я решил, что мой другой класс будет создан. Теперь кажется, что весь код запускается один раз без создания одного экземпляра. – Scab

+0

Как я уже сказал, если это не сработает, попробуйте эту трассировку (MovieClip (parent) .setting1); – Neguido

+0

trace (MovieClip (parent) .setting1) дает TypeError: Ошибка # 1009: Не удается получить доступ к свойству или методу ссылки на нулевой объект. \t at Page1() \t at MyApp() Я думаю, что я понимаю ваше объяснение относительно порядка, в котором работает код, имеет смысл, хотя и не так, как работает в порядке. Я все еще не понимаю, почему мои классы не могут получить доступ к общедоступным переменным. Я предполагаю, что экземпляры, как только они созданы и/или добавлены, не имеют проблем с доступом к общедоступным переменным друг от друга, но из того, что я прочитал, я понял, что переменные должны быть доступны классам. Это было просто неправильно? – Scab

Смежные вопросы