1

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

[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 完全没问题,而

[武器.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,则不会出现任何错误。

我想我错过了一些非常明显的东西,但我无法区分这两种情况,但一种有效,另一种无效。你能帮助我吗?谢谢!

4

2 回答 2

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

于 2012-08-08T00:33:18.870 回答
0

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

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

要解决这个问题,只需将有问题的函数标记为“公共函数”并且用户“覆盖公共”而不是“覆盖受保护”以从父类(子类)访问它,就像您通常那样。如果类成员必须是私有的或受保护的,则需要以另一种方式访问​​它。

于 2013-12-23T19:47:17.623 回答