2012-08-08 98 views
1

我創建了兩個類,它們定義了對象的一般結構,以及許多父類變體的子類。變量在超類中有類型聲明,在子類中有聲明值。但是:AS3超類變量和子類錯誤

[Body_Part_Armor.as]

package { 
    import flash.display.*; 
    public class Body_Part_Armor extends MovieClip 
    { 
     var agility_malus; 
     var hp_total; 
     var defense; 
     var armor_extra_height; 
     var armor_extra_width; 
     var hp_left; 
     public function Body_Part_Armor() 
     { 
      hp_left = hp_total; 
     } 
    } 
} 

[Chest_Armor_1.as]

package 
{ 
    public class Chest_Armor_1 extends Body_Part_Armor 
    { 
     agility_malus = 2; 
     hp_total = 20; 
     defense = 7; 
     armor_extra_height = 10; 
     armor_extra_width = 6; 

     public function Chest_Armor_1() 
     { 
     } 
    } 
} 

對於編譯器的調試測試Body_Part_Armor和Chest_Armor_1完全細,而

[ Weapon.as]

package 
{ 
    import flash.display.*; 
    public class Weapon extends MovieClip { 
     var weapon_type:Number; 
     var n_attacks:Number; 
     var damage:Number; 
     var precision:Number; 
     // some other variables in here 
     var is_empty_weapon:Boolean; 
     public function Weapon() 
     { 
     }   
    } 
} 

[Empty_Arm_Weapon.as]

package 
{ 
    public class Empty_Arm_Weapon extends Weapon 
    { 
     is_empty_weapon = true; 
     public function Empty_Arm_Weapon() { 
     } 
    } 
} 

給我以下錯誤: 1120:未定義的屬性訪問is_empty_weapon (但如果我寫VAR is_empty_weapon = TRUE;在Empty_Arm_Weapon中,它會抱怨與名稱空間public中的變量的繼承定義發生衝突)。

但是,如果我在構造函數Empty_Arm_Weapon()中定義了變量值is_empty_weapon = true,那麼我將不會收到任何錯誤。

我想我錯過了一些非常明顯的事情,但我無法分辨兩種情況之間的區別,但一種可行,另一種則不行。 你能幫我嗎? 謝謝!

回答

2

應變量的賦值進入類似的構造器:如果您希望此

package 
{ 
    public class Empty_Arm_Weapon extends Weapon 
    { 
     public function Empty_Arm_Weapon() 
     { 
      is_empty_weapon = true; 
     } 
    } 
} 

另外,您可以用默認值爲true聲明它所有的繼承類

package 
{ 
    import flash.display.*; 
    public class Weapon extends MovieClip { 
     protected var weapon_type:Number; 
     protected var n_attacks:Number; 
     protected var damage:Number; 
     protected var precision:Number; 
     // some other variables in here 
     protected var is_empty_weapon:Boolean=true; 
     public function Weapon() 
     { 
     }   
    } 
} 

還要確保範圍變量,以便它們可以被子類訪問(如果這是你想要的),將它們標記爲受保護的(可由此類和子類訪問)或公共的(可通過此類訪問子類和實例) 。

編輯

我相信你,你的行爲之間的差異看具體的問題可能與事實,你必須在第二種情況下,並在第一種情況下的類型不是一個類型的變量做聲明。這意味着他們將默認未定義而不是false或null或0,這可能會產生一些奇怪的行爲,無論哪種方式,這不是我所知道的正確方法,設置默認值或在子類中覆蓋默認值在構造函數中。

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9d.html

+0

正如我已經在OP說,我可以用它在構造函數中定義的價值的工作。問題是爲什麼然後它在Body_Part_Armor - Chest_Armor_1中使用子類類定義中的值聲明(不在構造函數內)正常工作? – Alucardy80 2012-08-08 00:43:03

+0

這樣做沒有任何意義。任何不在構造函數或方法中的東西都應該是該類的新變量聲明。在這裏做任務對我來說並不意味着什麼,你什麼時候期望這個任務發生?對象創建之前?那麼它將沒有內存來存儲這些屬性。只有在構造函數或更高版本中對我有意義。我不知道爲什麼這不會爲你造成問題。 – shaunhusain 2012-08-08 00:45:07

+0

我是否正確地將你的代碼分割成單獨的文件? – shaunhusain 2012-08-08 00:49:03

0

另外一個相關的問題,如果你是從一個子類的實例中加載超類的實例,覆蓋保護功能會拋出「不是一個函數」的錯誤,即使在編譯器中它顯示相同功能的自動完成。

原因是雖然類的繼承允許訪問此函數,但子對象不是運行時的父對象的擴展,而是僅由創建者的超類重合的子對象。

爲了解決這個問題簡單地標記問題爲「公共職能」和用戶功能「覆蓋公共」,而不是「覆蓋保護」從父(子類)訪問它,因爲你通常會。如果班級成員必須是私人或受保護的,您需要以另一種方式訪問​​它。