我正在开发一款AS3游戏。有一个武器超类,其中包含射击和重装等方法,它们在所有武器中的行为都相同。
特定武器,如手枪,霰弹枪继承自这个类,所以他们可以使用这些方法。它们具有公共静态变量,例如射击类型的子弹,射速,子弹扩散,使它们独特,并用于这些方法。它们需要是公共的静态变量,所以我可以从核心的其他地方查找它们,而我所有的都是被解雇的武器类型。
这是我应该怎么做的吗? Weapon超类如何访问这些变量?
答案 0 :(得分:0)
public static const RATE:uint = 2;
Weapon
课程可以Weapon.RATE
或RATE
访问。对于静态对象,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
}
}