2010-04-11 99 views
2

我試圖從父項的子AS3訪問父類的變量從子

//Parent 
public class Main extends Sprite 
    { 
    public var selectedSquare:Sprite; 

    public function Main() 
     { 
     //inits and adds new Square child class to display list 
     } 
... 

------- 

//Child 
public function dragSquare(evt:MouseEvent):void 
    { 
    Sprite(parent).selectedSquare = this; //evil doesn't work! 
    parent.addChild(this); 
    this.startDrag(); 
    } 

我收到此錯誤分配父母的變量,但我父母鑄造從級DisplayObjectContainer到雪碧這樣我不知道爲什麼它不起作用。

1119:雪碧:通過 參考與 靜態類型flash.display使用可能未定義 屬性selectedSquare的訪問。

回答

4

因爲Sprite不會引用任何「selectedSquare」,所以您應該將父類轉換爲Main而不是Sprite。如果Main要擴展MovieClip,這不會成爲問題,因爲MovieClips可以有動態創建的引用。

建議修改兒童功能:

public function dragSquare(evt:MouseEvent):void 
{ 
    (parent as Main).selectedSquare = this; 
    parent.addChild(this); 
    this.startDrag(); 
} 
+0

* face palm * 謝謝 – TheDarkIn1978 2010-04-11 23:15:46

1

的另一個原因是,這可能無法正常工作是你正在試圖將孩子父母的顯示列表前使用parent產權。

Sprite(parent).selectedSquare = this; 
parent.addChild(this); 

那第二行是我擔心的。在此代碼中,當前對象(this必須已作爲子對象添加到父對象(Main)以使第一行正常工作。所以,當前對象還不是父對象的子對象,在這種情況下,您需要修改代碼。

或者,第二行是不必要的(因爲this已經是Main一個孩子,這就是爲什麼this.parent,或者只是parent,按預期工作)。

但我相信,你的代碼可能設置的很好。你不需要第二條線,因爲它完全是多餘的。

我希望有幫助!讓我知道你是否希望我澄清任何事情。 (當然,這是假設你並不知道所有這一切,並且沒有用多餘的addChild調用做某種瘋狂的,神祕的,奇怪的魔法,你永遠無法告訴魔術師!)

+0

感謝您的回覆螺旋節。是的,「this」已被添加到顯示列表中,該類別創建的所有其他類似對象中。 parent.addChild(this)被簡單地稱爲將「this」帶到顯示列表的頂部。事後看來,我應該從我的例子中省略它以避免混淆。 – TheDarkIn1978 2010-04-12 07:52:58

+2

啊是的。當我提到「奧術魔法」時,那正是我期望你所做的。不要挑剔,但是如果使用'parent.setChildIndex(this,parent.numChildren-1)'語法,它可能會更清晰,除了它更多* verbose *之外。 – ivanreese 2010-04-12 16:32:05

+0

感謝您的提示,我會這樣做,因爲它更具體,可能會避免以後的問題,因爲程序變得更復雜。 – TheDarkIn1978 2010-04-12 17:39:50