在AS3中访问子类属性

时间:2012-10-31 00:20:49

标签: actionscript-3 flash class

我无法访问类的子对象的属性。当我尝试跟踪它时,我收到此错误:

  

通过引用访问可能未定义的属性tipo   static类型flash.display:DisplayObject。

我的代码如下:

public class naftaBonusClass extends MovieClip {
    private var _tipo = "nafta";

    public function get tipo():String
    {
        return _tipo;
    }
}

主要

if (getChildAt(i).localToGlobal(new Point(stage.y,0)).y > 650){
    trace(getChildAt(i).tipo);
    removeChildAt(i);
}

如果我能够知道孩子的班级,那么我所拥有的另一个问题是同样的,因为我想管理各种不同的班级并知道每个孩子的班级。提前谢谢。

3 个答案:

答案 0 :(得分:0)

您需要先将.getChildAt()的结果投射到naftaBonusClass对象:

if(getChildAt(i).localToGlobal(new Point(stage.y, 0)).y > 650)
{
    var myObj:naftaBonusClass = getChildAt(i) as naftaBonusClass;
    trace(myObj.tipo);

    removeChildAt(i);
}

或者简单地说:

trace((getChildAt(i) as naftaBonusClass).tipo);

Here's some more information about type casting in AS3

至于不知道每个对象是什么,这是你需要清理和妥善管理的东西。例如,您可以将每个元素存储在一个Array中,并且每个Arrays都应该包含某种类型的对象。然后,您将能够使用键入的for each()循环查看数组:

for each(var i:naftaBonusClass in naftaList)
{
    trace(i.tipo);
}

更进一步,您可以为对象创建一个基类,并在其中存储一个将在循环中调用的方法。这样你只需要转换为基类并调用该方法,该方法可以在子类中重写:

class MyChild extends MovieClip
{
    public function update():void{ }
}

然后修改了naftaBonusClass

class naftaBonusClass extends MyChild
{
    private var _tipo:String = "nafta";

    // This is where the work should be done.
    override public function update():void
    {
        trace(tipo);
    }

    public function get tipo():String
    {
        return _tipo;
    }
}

你的更新循环:

if(getChildAt(i).localToGlobal(new Point(stage.y, 0)).y > 650)
{
    (getChildAt(i) as MyClass).update();
    removeChildAt(i);
}

答案 1 :(得分:0)

您可能希望对该实例进行类型转换,除非您希望将其视为显示对象:

if (getChildAt(i).localToGlobal(new Point(stage.y,0)).y > 650) {
    trace(naftaBonusClass(getChildAt(i)).tipo);
    removeChildAt(i);
}

答案 2 :(得分:0)

Marty告诉你的是实现你想要的最好方法。但是如果你无法知道或控制对象的类,那么你总是可以向下转换它们并像这样访问tipo:

if (getChildAt(i).localToGlobal(new Point(stage.y,0)).y > 650){
    var theObject:Object = getChildAt(i) as Object;
    if(theObject.hasOwnProperty("tipo")){
        trace(theObject.tipo);
    }
    removeChildAt(i);
}