在 Dart 中不继承静态变量的基本原理是什么?

cc *_*ung 5 static types class dart

在 中Dart,如果一个类扩展另一个类,则扩展类继承所有超类的非静态变量,但不继承其任何静态变量。

例如

class TestUpper {
  static final String up = 'super';
  String upup = 10;
}

class TestLower extends TestUpper {
  static final String low = 'lower';
  String lowlow = 11;
} 

var lower = new TestLower();
print( lower.lowlow );  // <== 11
print( lower.upup );    // <== 10
print( TestLower.low ); // <== "lower"
print( TestLower.up );  // <== No static getter 'get:up' declared in class 'TestLower'
Run Code Online (Sandbox Code Playgroud)

这是正常行为吗?如果是这样,如果有人解释其背后的基本原理,我将不胜感激。

Ale*_*uin 7

是的,静态成员没有继承。请参阅语言规范的静态方法部分 (\xc2\xa710.7):

\n
\n

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

\n

当然,静态方法的整个概念是有争议的,但这里保留它是因为很多程序员都熟悉它。Dart 静态方法可以被视为封闭库的函数。

\n
\n

  • 我明白其中的道理,但不同意。如果您要在扩展类中公开超类,则应该公开超类。当不反思地工作时,我可以看到哪里是不必要的 - 只需看看代码!- 但是当一般使用类时,非继承是一个真正的痛苦。 (3认同)