2010-04-11 98 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