2012-08-08 96 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

另外一个相关的问题,如果你是从一个子类的实例中加载超类的实例,覆盖保护功能会抛出“不是一个函数”的错误,即使在编译器中它显示相同功能的自动完成。

原因是虽然类的继承允许访问此函数,但子对象不是运行时的父对象的扩展,而是仅由创建者的超类重合的子对象。

为了解决这个问题简单地标记问题为“公共职能”和用户功能“覆盖公共”,而不是“覆盖保护”从父(子类)访问它,因为你通常会。如果班级成员必须是私人或受保护的,您需要以另一种方式访问​​它。