超类中的AS3方法,子类中的公共静态变量

时间:2013-10-17 17:43:36

标签: actionscript-3 flash oop object

我正在开发一款AS3游戏。有一个武器超类,其中包含射击和重装等方法,它们在所有武器中的行为都相同。

特定武器,如手枪,霰弹枪继承自这个类,所以他们可以使用这些方法。它们具有公共静态变量,例如射击类型的子弹,射速,子弹扩散,使它们独特,并用于这些方法。它们需要是公共的静态变量,所以我可以从核心的其他地方查找它们,而我所有的都是被解雇的武器类型。

这是我应该怎么做的吗? Weapon超类如何访问这些变量?

1 个答案:

答案 0 :(得分:0)

public static const RATE:uint = 2;

Weapon课程可以Weapon.RATERATE访问。对于静态对象,Scope有点奇怪。我个人认为您不应该只使用RATE访问静态对象,但它可以正常工作。

子类继承静态属性和方法。它们只属于它们所创建的类(如果你知道静态对象是什么,这是有意义的)。因此,对于所有类,甚至是扩展Weapon的类,您必须通过public static访问Weapon.RATE对象。

然而,我注意到有一种奇怪的现象。如果使用protected访问修饰符而不是public,则类可以通过RATE访问超类中的静态对象,就好像它是在类本身中创建的一样。我不知道背后的逻辑,但它确实有效。

所以:

public class Weapon {
    protected var RATE:uint = 2;
    public var RATE2:uint = 5;
}

public class Gun extends Weapon {
    trace( RATE ); // output 2
    trace( Weapon.RATE ); // output 2
    trace( RATE2 ); // output Error, access of undefined property
    trace( Weapon.RATE2 ); // output 5
}

编辑:回复第一条评论:

超类的工作方式,扩展类的对象可以访问超类中的所有公共对象和受保护对象。

所以让我们说武器类是这样的:

public class Weapon {
    public function shoot():void{}
    protected function reload():void{}
    private function aim():void{}
}

您可以像在超类本身中一样访问子类中的那些方法:

public class Pistol extends Weapon{
    public function Pistol() {
        this.shoot(); // works
        this.reload(); // works
        this.aim(); // doesn't work because it is private
    }
}

现在,如果您希望进一步抽象,可以使用受保护或公共修饰符在超类中设置属性,并使用所有武器的默认值。在您的超类方法中,您只需调用这些值。在子类中,您将它们更改为您需要的任何内容

public class Weapon {
    public var rate:uint = 2;

    public function shoot():void{
        // use this.rate here
    }
    protected function reload():void{}
    private function aim():void{}
}

public class Pistol extends Weapon{
    public function Pistol() {
        this.rate = 5; // value of rate is now 5 and will be used in shoot()
        this.shoot(); // works
        this.reload(); // works
        this.aim(); // doesn't work because it is private
    }
}