2013-10-17 101 views
0

我在AS3中开发游戏。有一个武器超类,其中包含射击和重装等方法,这些方法在所有武器中表现相同。超类中的AS3方法,子类中的公共静态变量

特殊武器,如手枪,霰弹枪继承这个类,使他们可以使用这些方法。他们有公共的静态变量,例如射击的子弹类型,射速,子弹传播,使它们独一无二,并用于这些方法。他们需要是公共的静态变量,所以我可以从核心的其他地方查看它们,当我到达那里的时候就是被解雇的武器类型。

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

+0

我认为'Interface'对于此设计来说是一个好方法。我必须相信,霰弹枪和手枪将需要特定的功能,因此应该在适当的班级进行处理。 – prototypical

+0

这里有一个很好的链接,可以学习一个'Interface',很遗憾不能全部解释。现在没有时间详细说明,但这会帮助您了解一个好方法 - > http://blog.shoguniphicus.com/2011/02/02/interface-in-as3-program-to-an -interface-not-an-implementation/ – prototypical

回答

0
public static const RATE:uint = 2; 

即由Weapon类或者作为Weapon.RATE或作为RATE访问。当涉及到静态对象时,范围有点奇怪。我个人认为你不应该只能使用RATE访问静态对象,但它可以工作。

子类不要继承静态属性和方法。它们完全属于它们创建的类(如果你知道静态对象的真实含义,这是有意义的)。因此,对于所有类别,即使是延伸Weapon的类别,都必须通过Weapon.RATE访问public static对象。

但是我注意到了一个奇怪的现象。如果使用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 
    } 
} 
+0

嗨,谢谢你的回应!我需要超类访问子类中的变量,而不是相反。武器类有方法,手枪类有决定手枪应该如何表现的变量。但是当武器超类没有在超类本身中定义时,它们如何访问这些变量? –

+0

它的工作原理是,如果我在子类中定义了静态变量,在超类中定义了它们的私有版本,并在子类构造函数中复制了值,那么这样做是否可行? –

+0

@JimSreven我完全误读你的问题。我道歉。我已经更新了我的答案。我认为你应该避免在这种情况下使用静态对象。您始终可以将静态对象作为参数传递给您的方法,但我认为我提出的方法更简洁,更易于使用/实现。 –

相关问题