我在AS3中开发游戏。有一个武器超类,其中包含射击和重装等方法,这些方法在所有武器中表现相同。超类中的AS3方法,子类中的公共静态变量
特殊武器,如手枪,霰弹枪继承这个类,使他们可以使用这些方法。他们有公共的静态变量,例如射击的子弹类型,射速,子弹传播,使它们独一无二,并用于这些方法。他们需要是公共的静态变量,所以我可以从核心的其他地方查看它们,当我到达那里的时候就是被解雇的武器类型。
这是我应该怎么做的吗? Weapon超类如何访问这些变量?
我在AS3中开发游戏。有一个武器超类,其中包含射击和重装等方法,这些方法在所有武器中表现相同。超类中的AS3方法,子类中的公共静态变量
特殊武器,如手枪,霰弹枪继承这个类,使他们可以使用这些方法。他们有公共的静态变量,例如射击的子弹类型,射速,子弹传播,使它们独一无二,并用于这些方法。他们需要是公共的静态变量,所以我可以从核心的其他地方查看它们,当我到达那里的时候就是被解雇的武器类型。
这是我应该怎么做的吗? Weapon超类如何访问这些变量?
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
}
}
嗨,谢谢你的回应!我需要超类访问子类中的变量,而不是相反。武器类有方法,手枪类有决定手枪应该如何表现的变量。但是当武器超类没有在超类本身中定义时,它们如何访问这些变量? –
它的工作原理是,如果我在子类中定义了静态变量,在超类中定义了它们的私有版本,并在子类构造函数中复制了值,那么这样做是否可行? –
@JimSreven我完全误读你的问题。我道歉。我已经更新了我的答案。我认为你应该避免在这种情况下使用静态对象。您始终可以将静态对象作为参数传递给您的方法,但我认为我提出的方法更简洁,更易于使用/实现。 –
我认为'Interface'对于此设计来说是一个好方法。我必须相信,霰弹枪和手枪将需要特定的功能,因此应该在适当的班级进行处理。 – prototypical
这里有一个很好的链接,可以学习一个'Interface',很遗憾不能全部解释。现在没有时间详细说明,但这会帮助您了解一个好方法 - > http://blog.shoguniphicus.com/2011/02/02/interface-in-as3-program-to-an -interface-not-an-implementation/ – prototypical