2013-02-01 57 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

在斷點處看不到堆棧跟蹤可能是您通過某種異步機制到達該位置的一個信號。也許還有其他原因。但那是我的猜測。這就是我們可以做的所有事情w/out看到任何代碼:) –

+0

另一個瘋狂的猜測 - 你的Klass是DisplayObject的後代,並且它的一個實例放在你的舞臺上在Adobe Flash CS中。這樣,這些實例就會使用默認值實例化,因此您會收到您檢測到的構造函數調用。 – Vesper

回答

0

我正在通過Cirrus接收類Unit的實例,並使用RegisterClassAlias來反序列化對象。當我這樣做時,似乎Spawn的實例必須由於某種原因自動實例化。這就是爲什麼你無法通過沒有默認參數的ojbects。在這種情況下,它會拋出一個錯誤,因爲我正在使用(params [0])爲空的參數。我在我的代碼的其他部分使用Cirrus,並且它工作正常,因爲它們的參數構造函數中包含所有ints和字符串。

0

好吧,這是一個什麼ppears將發生:

你有一個替代applyLevel重載超級類的設置。我認爲你的超級類二傳手也正在執行。

  • 您的setter方法覆蓋超類的方法,但沒有在那裏它做super.applyLevel = level:導致我這個結論的一些觀察。這意味着在超類中,應該保持級別值的存儲變量未初始化。 Actionscript中未初始化的整數默認爲0.

  • 您提到第二次調用Spawn的構造函數沒有參數。這是因爲levelData的數組從索引1開始。因此,此數組的索引0爲空。

  • 因此,超類版本的applyLevel setter方法正在從上面傳遞null元素。

我認爲這些事實是100%正確的。

有什麼不明白的是誰在呼叫超級班'applyLevel的版本也許超級班(EntityVO)正在做它的構造函數......希望這應該足以讓你指向正確的方向。

+0

感謝您的嘗試,但這不是發生在這種情況下。發生的是,我正在通過Cirrus接收類Unit的實例,並使用RegisterClassAlias對對象進行反序列化。當我這樣做時,似乎Spawn的實例必須由於某種原因自動實例化。這就是爲什麼你無法通過沒有默認參數的ojbects。在這種情況下,它會拋出一個錯誤,因爲我正在使用(params [0])爲空的參數。我在我的代碼的其他部分使用Cirrus,並且它工作正常,因爲它們的參數構造函數中包含所有ints和字符串。 – Artemix