1

请考虑以下代码:

abstract class ClassAbstract {
    static int _someValue = 10;

    ClassAbstract() {}   
  }

  class NormalClass extends ClassAbstract {
    NormalClass(): super() {}

    void RunMe() {
      print("Value from abstract super: $_someValue");  // Error here
    }
  }


  void main() {
    NormalClass normalClass = new NormalClass();
    normalClass.RunMe();
    print("Application close");
  }

当我运行它时,我收到一个错误:

Class 'NormalClass' has no instance getter '_someValue@0x213da713'.

NoSuchMethodError : method not found: '_someValue@0x213da713'
Receiver: Instance of 'NormalClass'
Arguments: []

也许我在这里弄错了,但是全局静态变量必须被继承,但是从这个例子中可以看出它没有......

4

1 回答 1

2

Dart 中确实没有继承静态成员。如果你想在他们的声明类之外访问它们,你总是必须用类名来限定访问。

在你的情况下:

class NormalClass extends ClassAbstract {
  void runMe() {
    print("Value from abstract super: ${ClassAbstract._someValue}");
  }
}

规范在第 7.7 章(非规范部分)中对此有几句话要说:

静态方法的继承在 Dart 中几乎没有用处。静态方法不能被覆盖。任何需要的静态函数都可以从其声明库中获取,无需通过继承将其引入作用域。经验表明,开发人员对继承方法不是实例方法的想法感到困惑。

当然,静态方法的整个概念是值得商榷的,但在这里保留它是因为很多程序员都熟悉它。Dart 静态方法可以看作是封闭库的函数。

于 2013-04-07T08:47:01.560 回答