Flex:从父级访问静态常量

Mr.*_*irl 2 apache-flex constants parent-child actionscript-3

为什么我不能将父类中定义的静态常量视为Flex中子类的属性?

柔性

class A {
  public static const MAX:int = 100;
}

class B extends A {}

A.Max; // Valid
B.Max; // Invalid
Run Code Online (Sandbox Code Playgroud)

Java的

class A {
  public static final int MAX = 100;
}

class B extends A {}

A.Max; // Valid
B.Max; // Valid
Run Code Online (Sandbox Code Playgroud)

Mr.*_*irl 5

快速肮脏的黑客:

为了将常量MAX视为属性B,必须重新定义MAX并将其设置为A.MAX:

class B extends A {
  public static const MAX:int = A.MAX;
}
Run Code Online (Sandbox Code Playgroud)

静态属性未继承

子类不继承静态属性.这意味着无法通过子类的实例访问静态属性.只能通过定义它的类对象访问静态属性.例如,以下代码定义了一个名为Base的基类和一个扩展Base名为Extender的子类.名为的静态变量test在Base类中定义.以下摘录中编写的代码不会在严格模式下编译,并在标准模式下生成运行时错误.

package {
    import flash.display.MovieClip;
    public class StaticExample extends MovieClip
    {
        public function StaticExample()
        {
            var myExt:Extender = new Extender();
            trace(myExt.test);// error
        }
    }
}

class Base {
    public static var test:String = "static";
}

class Extender extends Base { }
Run Code Online (Sandbox Code Playgroud)

访问静态变量的唯一方法test是通过类对象,如下面的代码所示:

Base.test;
Run Code Online (Sandbox Code Playgroud)

但是,允许使用与静态属性相同的名称定义实例属性.这样的实例属性可以在与静态属性相同的类中定义,也可以在子类中定义.例如,前面示例中的Base类可以具有名为的实例属性test.以下代码编译并执行,因为Extender类继承了实例属性.如果将测试实例变量的定义移动到Extender类,但代码也将被编译并执行.

package
{
    import flash.display.MovieClip;
    public class StaticExample extends MovieClip
    {
        public function StaticExample()
        {
            var myExt:Extender = new Extender();
            trace(myExt.test);// output: instance
        }
    }
}

class Base
{
    public static var test:String = "static";
    public var test:String = "instance";
}

class Extender extends Base {}
Run Code Online (Sandbox Code Playgroud)