AS3超类变量和子类错误

时间:2012-08-08 00:28:14

标签: actionscript-3 variables subclass superclass

我正在创建两个定义对象的一般结构的类,以及许多子类,它们是父类的变体。变量在超类中具有类型声明,在子类中具有值声明。但是:

[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 个答案:

答案 0 :(得分: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()
        {   
        }           
    }
}

还要确保对变量进行范围调整,以便子类可以访问它们,如果这是你想要的那样,将它们标记为受保护(可由此类和子类访问)或公共(可以使用它们,子类和实例访问)这个对象)。

修改

我相信您在行为之间的差异中看到的具体问题可能与您在第二种情况下有类型变量的事实有关,而在第一种情况下,未声明类型。这意味着它们将默认为undefined而不是false或null或0,这可能会产生一些奇怪的行为,无论是哪种方式都不是我已经学会了正确的方法,在定义时设置默认值或在子类中覆盖默认值在构造函数中。

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

答案 1 :(得分:0)

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

原因是虽然类的继承允许访问此函数,但子对象在运行时不是父对象的扩展,而是一个子对象,它只是巧妙地创建者的超类。

要解决此问题,只需将所讨论的函数标记为“公共函数”,并将用户“覆盖公共”而不是“覆盖受保护”,以便像通常那样从父(子类)访问它。如果班级成员必须是私人或受保护的,你需要以另一种方式访问​​它。