【问题标题】:Is it possible to use static variable in subclass from parent class using subclass property, in actionscript 3?是否可以在 actionscript 3 中使用子类属性在父类的子类中使用静态变量?
【发布时间】:2014-04-01 17:31:53
【问题描述】:

在下面的代码中,你能告诉我为什么在调用 b.method() 时 _myVar 为 null 而 g 不为 null 吗?

我正在使用 ActionScript3。

我错过了什么吗?

public Class A{
    protected var _myVar:Type;

    protected method(){
        _myVar // do something with _myVar...

        var g:Type = B.stVar;
    }
}

public Class B extends A{
    public static var stVar:Type;

    public B(){
        _myVar = stVar;
    }
}

public class MainClass{
    mainMethod(){
        B.stVar = new Type();

        var b:B = new B();
        b.method(); // here _myVar is null while g is not!!!! 
    }
}

【问题讨论】:

  • 不太确定,但我的猜测是因为 stVar 是一个静态变量。为了让它工作,_myVar 也需要是一个静态变量。您不能将静态值分配给普通属性,反之亦然。

标签: actionscript-3 inheritance static-members


【解决方案1】:

这是因为您从未为变量b._myVar 赋值。在B()A()B.method 中没有代码实际上为this._myVar 赋值,对象类型变量的默认值为null。 B.stVar 已分配并可从 b.method 获得,因为它的分配发生在 MainClass.mainMethod() 中,并且由于它是静态的,因此它的值与 B 的实例无关。静态变量不附加到类的任何实例,无论实例如何都可以分配它。动态(“正常”)变量,如 _myVar,附加到某个类的某个实例,在您的情况下,AB 类实例具有此变量并能够在其中存储单独的值.

在您的情况下,您可以在 public function A() 中放置一个语句 _myVar=new Type(),它将为每个 A 类实例分配一个值。 B 类实例会为它们的_myVar 变量分配一个值,因为Flash implicitly calls super() constructor 用于扩展另一个类的类。因此,您将此代码添加到您的结构中:

public class A {
    protected var _myVar:Type;
    public class A() {
        _myVar=new Type();
    }
    ... // rest of code intact
}

然后您的_myVar 将被分配到A 的每个实例以及扩展A 的那些类的每个实例中。

【讨论】:

  • _myVar 在 B 类构造函数中被分配了 stVar 的值。因此,每次实例化 B 对象时,_myVar 都会获取 stVar 的值。当调用 b.method() 时,_myVar 已经被分配了一个值。我这样做的原因是我需要在 A 类方法中操作 stVar 。我不能将 stVar 放入 A 类,因为它对 A 类的每个子类都非常具体。它不起作用的原因可能是无法将静态值分配给对象变量(如第一个评论我的帖子)?
  • 确实很奇怪。请在b.method() 之前添加一个trace("Now calling method()"),并在B() 构造函数中添加一个trace(stVar)。也许你得到的是 A.method() 从其他地方调用的结果。
  • 找到导致错误的原因(见我的回答)。非常感谢:)
【解决方案2】:

这对我来说似乎有点尴尬,但是像这样在 B 类构造函数中分配 _myVar:

_myVar = stVar;

不起作用并将空值分配给 _myVar。 我试过这样做:

_myVar = B.stVar;

而且效果很好。

有人知道为什么吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2011-02-05
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多