2012-10-31 145 views
0

我不能訪問類的子對象的屬性。當我嘗試追蹤它時,出現此錯誤:訪問AS3中的子類屬性

通過引用訪問可能未定義的屬性tipo static type 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); 
} 

而另一個問題,我已在這個同樣的方式,如果我能因爲我想知道孩子的班級管理各種不同的班級,並且知道每個孩子是什麼班級。提前致謝。

回答

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

至於不知道每個對象會是什麼,這是你需要清理和正確管理的東西。例如,您可以將每個元素存儲在一個數組中,並且每個數組都應該包含某種類型的對象。然後,您就可以查看陣列與一個類型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); 
} 
+0

的事情是,我不知道這個類,因爲我的孩子的可各種不同的類別。 –

+0

但他們都有財產「tipo」。 –

+0

@JonathanCalb創建一個基類,*您的所有對象*將從定義的屬性'tipo'繼承。如果你需要對每個元素做不同的事情,你應該用一個'update()'方法創建一個基類,所有的對象都會擴展,然後在每個子類中做任何你需要做的事情。 – Marty

0

您可能要強制轉換該實例,除非你希望它被視爲顯示對象:

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

馬蒂告訴你的是實現你想要的最好方法。但是,如果你無法知道或控制對象的類的方式,那麼你可以隨時向下轉換他們,像這樣訪問類型:

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); 
}