Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 超类中的AS3方法,子类中的公共静态变量_Actionscript 3_Flash_Oop_Object - Fatal编程技术网

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

Actionscript 3 超类中的AS3方法,子类中的公共静态变量,actionscript-3,flash,oop,object,Actionscript 3,Flash,Oop,Object,我正在用AS3开发一个游戏。有一个武器超类,它包含射击和重新加载等方法,在所有武器中都表现相同 特定的武器,如手枪、霰弹枪继承自该类,因此它们可以使用这些方法。它们有公共的静态变量,例如要发射的子弹类型、射速、子弹扩散,这些变量使它们具有唯一性,并在这些方法中使用。它们需要是公共的静态变量,这样我就可以从核心中的其他地方查找它们,而我所掌握的只是发射的武器类型 我应该这样做吗?武器超类如何访问这些变量 public static const RATE:uint = 2; 由武器类以武器.速率或

我正在用AS3开发一个游戏。有一个武器超类,它包含射击和重新加载等方法,在所有武器中都表现相同

特定的武器,如手枪、霰弹枪继承自该类,因此它们可以使用这些方法。它们有公共的静态变量,例如要发射的子弹类型、射速、子弹扩散,这些变量使它们具有唯一性,并在这些方法中使用。它们需要是公共的静态变量,这样我就可以从核心中的其他地方查找它们,而我所掌握的只是发射的武器类型

我应该这样做吗?武器超类如何访问这些变量

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
    }
}