【问题标题】:Variables declared in constructor conflicting with class properties构造函数中声明的变量与类属性冲突
【发布时间】:2011-05-23 12:27:11
【问题描述】:

我正在通过扩展 flash.display.SimpleButton 在 ActionScript 中创建一个按钮

但是,当我在构造函数中声明某些变量时,按钮的行为与预期不同,这些变量也恰好作为属性存在于 SimpleButton 类中。他们似乎有冲突..

这是为什么?不应该允许本地声明的变量与类似命名的类属性共存吗?

下面的片段可能更好地说明了这个问题:

public class MyButton extends SimpleButton{

    public function MyButton(/*..*/){

        var upState:ButtonDisplayState = new ButtonDisplayState(/*..*/));
        var downState:ButtonDisplayState = new ButtonDisplayState(/*..*/);      
        var overState:ButtonDisplayState = new ButtonDisplayState(/*..*/);      
        var hitTestState:ButtonDisplayState = new ButtonDisplayState(/*..*/);       

        super(upState, overState, downState, hitTestState);

   }

}

API 文档在这里(例如查找 upState):http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/SimpleButton.html#upState

谢谢,

哎呀。

【问题讨论】:

  • 只是为了澄清,将变量重命名为例如up、down、hit 等有效,但我很好奇为什么会发生这种情况?

标签: object actionscript orientation scope


【解决方案1】:

您不能重新声明已经存在的变量,无论是否是本地的。唯一可以执行此类操作的地方是方法参数,您可以在其中使用与本地/类变量相同的参数名称。

为什么不直接将这些状态传递给构造函数:

super(new ButtonDisplayState(/*..*/)), new ButtonDisplayState(/*..*/)), new ButtonDisplayState(/*..*/)), new ButtonDisplayState(/*..*/)));

或者直接在调用super(); 之后直接设置它们,如下所示:

upState = new ButtonDisplayState(/*..*/));
downState = new ButtonDisplayState(/*..*/);      
overState = new ButtonDisplayState(/*..*/);      
hitTestState = new ButtonDisplayState(/*..*/);  

【讨论】:

  • 好的,我刚刚做了一个测试,在构造函数中重新声明了一个类变量,当我跟踪该值时,我得到了预期的结果,即本地重新声明的变量对类声明的变量没有任何影响.我还对具有相同结果的属性进行了测试..
  • 你把它们放在之后 super();吗?
  • 我写了一个快速测试用例,并在调用super之前和之后设置了变量。在这两种情况下,超类和子类变量都不会相互干扰吗?
  • 我不确定我是否关注你,但即使你设法让它工作,我强烈不鼓励你使用相同的方式命名变量,但是在子类中做不同的事情。
  • 只是为了澄清一下,变量是在构造函数中声明的,据我所知,我发布这个问题的原因是它们的范围应该限于构造函数和没有任何东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多