2013-02-01 8 views
0

이 클래스를 가져 왔습니다. Klass.아무 이유없이 생성자가 호출되고 있습니다.

클래스 Klass에는 생성자에 대한 매개 변수가 있으며 기본값은 null입니다.

다른 클래스 안에 클래스 Klass의 객체를 만들고, 그것을 "MotherClass"라고 부를 수 있습니다.

이제 인스턴스가 Klass 객체를 인스턴스화 한 후 Klass의 생성자가 다시 호출됩니다. 즉, MotherClass의 생성자가 끝난 직후 (중단 점을 배치하고 단계별로 따라갔습니다), null과 함께 생성자 매개 변수.

것은이고, 나는 두 번째로 다시 생성자를 호출 할 수있는 어떤 단서 클라스의 생성자를 호출하지 않습니다 아무것도 스택 추적 ...

어떤 아이디어를 가지고 있지 않은거야?

감사합니다.

(클라스는 인터페이스를 구현하고, 나는 그것이 영향을 미치는 어떤 경우, 확실하지 않은 배열을 사용하여 인스턴스를 만들고 있어요)의 요청에 따라

코드를 추가 :

:

이 클래스의 MotherKlass입니다

public class Unit extends EntityVO{ 

    public function Unit(level:int = 1) 
      { 
       //init vars and stuff 
       //... 
       // 

       initLevelData(); 
       applyLevel = level; 

      } 

      private function initLevelData():void { 

       levelData[1] = [500, [[Spawn, this.entityToSpawn.type, this.entityToSpawn.level, 120]], "unit_level1"]; 
       levelData[2] = [1000, [[Spawn, this.entityToSpawn.type, this.entityToSpawn.level, 90]], "unit_level2"]; 
       levelData[3] = [2000, [[Spawn, this.entityToSpawn.type, this.entityToSpawn.level, 80]], "unit_level3"]; 
       levelData[4] = [5000, [[Spawn, this.entityToSpawn.type, this.entityToSpawn.level, 60]], "unit_level4"]; 

      } 

      override public function set applyLevel(level:int):void { 

       power  = power/maxPower * levelData[level][0]; 
       maxPower = levelData[level][0]; 
       behavior = levelData[level][1]; 

       for (var i:int = 0; i < behavior.length; i ++){ 
        _behaviorSteps[i] = new behavior[i][0](behavior[i].slice(1)); 
        _behaviorReqs.push(_behaviorSteps[i].req); 
       } 

      } 
     } 
    } 
} 

이이 클라스입니다 :

public class Spawn { 

    public class Spawn implements IBehavior 
     { 
      private var _entityType:String; 
      private var _entityLevel:int; 
      private var _spawnRate:int; 

      public function Spawn(params:Array = null){ 
       //had to put the if because of the second weird call to the constructor with null 
       if(params){ 
        _entityType = params[0]; 
        _entityLevel = params[1]; 
        _spawnRate = params[2]; 
       } 
      } 
     } 
    } 
} 
+6

MotherClass 및 Klass에 대한 클래스 정의의 매우 단순화 된 버전을 게시 할 수 있습니까? – inhan

+0

중단 점에서 스택 추적을 볼 수없는 것은 비동기 메커니즘을 통해 그 지점에 도착한 신호가 될 수 있습니다. 어쩌면 다른 이유가있을 수 있습니다. 그러나 그것은 나의 추측 일 것이다. 그리고 그게 우리가 할 수있는 모든 코드를보고 밖으로/ –

+0

또 다른 야생 추측 - 당신의 Klass는 DisplayObject의 자손이고, 그 인스턴스는 Adobe Flash CS 내 무대에 배치됩니다. 이렇게하면 이러한 인스턴스가 기본값으로 인스턴스화되므로 감지 한 생성자 호출을 수신하게됩니다. – Vesper

답변

0

Cirrus Unit 클래스의 인스턴스를 받고 RegisterClassAlias를 사용하여 개체를 deserialize합니다. 그렇게 할 때, Spawn의 인스턴스가 어떤 이유로 자동으로 인스턴스화되어야하는 것처럼 보입니다.그래서 기본 인수없이 ojbect를 전달할 수 없습니다. 이 경우, 인수가 null 인 (params [0])을 사용하고 있기 때문에 에러가 발생합니다. 내 코드의 다른 부분에서 Cirrus를 사용합니다. 매개 변수 생성자에 모든 int와 문자열이 있기 때문에 제대로 작동합니다.

0

좋아, 이것은 무엇인지 수행 할 내용 :

applyLevel에 대한 설정자가 있는데, 이는 수퍼 클래스 '설정자를 재정의합니다. 당신의 수퍼 클래스 세터도 처형되고 있다고 생각합니다.

  • 당신의 setter 메소드는 슈퍼 클래스의 메소드를 오버라이드 (override),하지만이 super.applyLevel = level 어디입니까 :이 결론에 저를 인도 일부 관찰. 즉, 수퍼 클래스에서 레벨 값을 유지해야하는 저장 영역 변수는 초기화되지 않습니다. 액션 스크립트의 초기화되지 않은 정수의 기본값은 0입니다.

  • Spawn의 생성자에 대한 두 번째 호출에는 매개 변수가 없습니다. 이는 배열 levelData이 인덱스 1에서 시작하기 때문에 발생합니다. 따라서이 배열의 인덱스 0은 null입니다.

  • 따라서 applyLevel 설정 메소드의 수퍼 클래스 버전이 위에서 null 요소를 전달 중입니다.

나는이 사실들이 100 % 정확하다고 생각한다.

어떤 사람이 슈퍼 클래스의 버전을 부르고 있는지 명확하지 않습니다. applyLevel 아마도 슈퍼 클래스 (EntityVO)가 생성자에서이를 수행하고 있습니다. 희망 사항은 올바른 방향으로 사용자를 안내하기에 충분해야합니다.

+0

시도해 주셔서 감사합니다. 그러나이 경우에는 어떤 일이 일어나고 있지 않습니다. 무슨 일이 일어나고있는 건, Cirrus를 통해 클래스 Unit의 인스턴스를 받고, RegisterClassAlias를 사용하여 객체를 deserialize하는 것입니다. 그렇게 할 때, Spawn의 인스턴스가 어떤 이유로 자동으로 인스턴스화되어야하는 것처럼 보입니다. 그래서 기본 인수없이 ojbect를 전달할 수 없습니다. 이 경우, 인수가 null 인 (params [0])을 사용하고 있기 때문에 에러가 발생합니다. 내 코드의 다른 부분에서 Cirrus를 사용합니다. 매개 변수 생성자에 모든 int와 문자열이 있기 때문에 제대로 작동합니다. – Artemix

관련 문제