2014-11-05 4 views
0

저는 현재 .as 파일과 클래스를 별도로 사용하는 법을 배우고 있습니다. 그러나 많은 것을 읽은 후에는 모든 것을 읽은 것과는 다르게 작동하는 것처럼 보입니다. 코드를 작동시키는 것뿐만 아니라 배우기 위해이 질문을 게시하고 있습니다. 예제는 실제 프로젝트를 테스트하고 단순화 한 것입니다.왜 AS3 클래스 파일에서 코드가 작동하지 않습니까?

내 파일 "MyApp.fla"에는 모양이 배경 인 프레임이 하나 있으며 DocumentClass는 "MyApp"로 설정됩니다. 라이브러리는 상징 "페이지 1을"보유 "페이지 1"

MyApp.as로 설정 그것의 클래스와 다른 배경 모양으로 1 프레임의 :

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 파일, 클래스, 생성자
  • ,691 전 363,210
  • 4 : 클래스
  • 2 이전 페이지 1 파일, 상기 클래스의 Document 파일
  • 1 : Document 클래스 파일 클래스
  • 3 전 : 페이지 1 파일에 :
  • 6 생성자 함수의 Document 파일 생성자
  • 널 생성 된 출력으로부터 순서가 완전히 예상대로 모두 배경 화면 모양이지만

기대했던 것. 내 주요 질문은 : 내 흔적이 왜 주문되지 않았습니까?

내 다음 질문 : Page1() 생성자가 public var setting1을 참조 할 수없는 이유는 무엇입니까?, 내가 주위에 Page1() 생성자에 인수로 set1을 전달하여 해결할 수 있다고 가정하지만, 나는 목적을 위해 그것을 피하고 있습니다.

답변

5

setting1은 부모 개체의 변수이며, 호출하려고하는 개체가 아닙니다. 이건 그냥 작동하지 않습니다.

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 : 정적 유형 flash.display : DisplayObjectContainer를 사용하여 참조가 정의되지 않은 속성 설정 1에 액세스 할 수 있습니다. Document 클래스가 마치 MainTimeline에 코드가있는 것처럼 실행하거나 MainTimeline의 장소에 MovieClip을 더 정확하게 만들고 해당 프레임에 생성자 코드를 붙여 말하고 실행할 수 있다고 생각했습니다. 그리고 다른 클래스가 인스턴스화 될 것이라고 생각했습니다. 이제 모든 코드가 단일 인스턴스를 만들지 않고 한 번 실행되는 것처럼 보입니다. – Scab

+0

내가 말했듯이, 그 작동하지 않는 경우이 추적 (MovieClip (부모) .setting1); – Neguido

+0

trace (MovieClip (parent) .setting1)는 TypeError를 제공합니다. Error # 1009 : null 객체 참조의 속성이나 메서드에 액세스 할 수 없습니다. \t at Page1() \t at MyApp() 나는 코드가 실행되는 순서에 대한 귀하의 설명을 이해한다고 생각하지만 순서대로 실행하지는 않습니다. 나는 아직도 내 수업이 공용 변수에 액세스 할 수없는 이유를 모르겠다. 나는 인스턴스가 생성되고 추가 된 후에도 서로간에 공용 변수에 액세스하는 데 문제가 없지만 클래스에서 액세스 할 수 있어야하는 변수를 이해해야한다고 생각합니다. 그게 틀렸어? – Scab