Actionscript 3 超类中的AS3方法,子类中的公共静态变量
我正在用AS3开发一个游戏。有一个武器超类,它包含射击和重新加载等方法,在所有武器中都表现相同 特定的武器,如手枪、霰弹枪继承自该类,因此它们可以使用这些方法。它们有公共的静态变量,例如要发射的子弹类型、射速、子弹扩散,这些变量使它们具有唯一性,并在这些方法中使用。它们需要是公共的静态变量,这样我就可以从核心中的其他地方查找它们,而我所掌握的只是发射的武器类型 我应该这样做吗?武器超类如何访问这些变量Actionscript 3 超类中的AS3方法,子类中的公共静态变量,actionscript-3,flash,oop,object,Actionscript 3,Flash,Oop,Object,我正在用AS3开发一个游戏。有一个武器超类,它包含射击和重新加载等方法,在所有武器中都表现相同 特定的武器,如手枪、霰弹枪继承自该类,因此它们可以使用这些方法。它们有公共的静态变量,例如要发射的子弹类型、射速、子弹扩散,这些变量使它们具有唯一性,并在这些方法中使用。它们需要是公共的静态变量,这样我就可以从核心中的其他地方查找它们,而我所掌握的只是发射的武器类型 我应该这样做吗?武器超类如何访问这些变量 public static const RATE:uint = 2; 由武器类以武器.速率或
public static const RATE:uint = 2;
由武器
类以武器.速率
或速率
访问。当涉及到静态对象时,作用域的工作方式有点奇怪。我个人认为您不应该仅以速率
访问静态对象,但它是有效的
子类不继承静态属性和方法。它们只属于创建它们的类(如果您知道静态对象实际上是什么,这是有意义的)。因此,对于所有类,甚至是扩展武器
的类,都必须通过武器.RATE
访问公共静态
对象
然而,我注意到了一个奇怪的现象。如果使用受保护的
访问修饰符而不是公共
,则类可以通过速率
访问其超类中的静态对象,就好像它是在类本身中创建的一样。我不知道背后的逻辑,但它是有效的
因此:
编辑:针对第一条评论:
按照超类的工作方式,扩展类的对象可以访问超类中所有公共和受保护的对象
假设武器等级是这样的:
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我完全误解了你的问题。我道歉。我已经更新了我的答案。我认为,在这种情况下应该避免使用静态对象。您可以始终将静态对象作为参数传递给您的方法,但我认为我建议的方法更干净,更易于使用/实现。我认为
接口
是一种很好的设计方法。我必须相信,猎枪和手枪需要特定的功能,因此应该在适当的类别中进行处理。这里有一个很好的链接,可以了解接口
,很抱歉没有全部解释。现在没有时间详细说明,但这将帮助您了解一个好方法->
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
}
}