2011-02-07 66 views
0

我已經叫了一個名爲「目標」與屬性對象「運動」:僅當使用方法時,對象纔是空引用?

private function start() { 
var movement:IMovement = new ZigZagMovement(target); 
target.movement = movement; 
mediumDifficulty(); 
} 

private function mediumDifficulty(target:AbstractTarget):void { 

      var movement:IMovement = target.movement; 
      movement.mediumMove(); 
     } 

我的抽象類Target看起來是這樣的:

package 
{ 
    import flash.display.Sprite; 

    public class AbstractTarget extends Sprite 
    { 
     protected var __movement:IMovement; 

     public function AbstractTarget() 
     { 
     } 

     public function set movement(value:IMovement):void 
     { 
      __movement = value; 
     } 

     public function get movement():IMovement 
     { 
      return __movement; 
     } 


    } 
} 

我的「運動」類看起來是這樣的:

package { 
    import flash.events.Event; 

    public class ZigZagMovement implements IMovement 
     { 
      private var __target:Object; 

      public function ZigZagMovement(target:Object) 
      { 
       __target = target; 
      } 



      public function mediumMove():void 
      { 
       // movement code 
      } 


     } 
    } 

奇怪的是,當我跟蹤「目標」和「target.movement」我得到了我期待的......但如果我嘗試說,寫:

target.movement.mediumMove(); 

OR

movement.mediumMove();

然後目標和「移動」(局部變量)追蹤爲空?

回答

1

我想我們需要更多的信息。我在代碼示例或解釋中沒有看到一些東西:

  • 什麼是您傳遞給mediumDifficulty函數的具體對象?這顯然不是ZigZagMovement,因爲這是AbstractTarget的移動成員變量。
  • 你什麼時候實例化AbstractTarget的具體子類?什麼是AbstractTarget的特定子類?你沒有發佈任何代碼。你確定在移動對象傳遞給mediumDifficulty函數時,它實際上已經實例化了一個移動對象嗎?

聽起來好像發生了什麼事情,你正在隔離測試的AbstractTarget子類有一個IMovement,但不是你傳遞給mediumDifficulty函數的那個​​,但沒有更多的信息,這很難說。

EDIT(如果我想的東西設置這是一個社區的wiki):隨着新的信息 -

看來,你有所謂的「目標」一類級別的變量你正在分配你的運動,並且你的mediumDifficulty()函數簽名中也有一個名爲「target」的參數,並且你實際上並沒有將你的類級目標對象傳遞給函數。這導致的結果是,當mediumDifficulty試圖確定目標的值時,它是空的,因爲它正在查看param而不是類級變量。這可能是你如何管理在start()函數中跟蹤target和target.movement,但在mediumDifficulty中沒有得到任何值。

在將來嘗試使用函數參數或函數範圍變量而不是與類範圍的變量共享名稱以減少這種混淆。

+0

我添加了更多細節...我對格式化表示歉意,似乎無法在此編輯器中正確使用。 – redconservatory 2011-02-07 18:29:18

相關問題