子类应该继承 Dart 中的私有 mixin 变量吗?

Joe*_*app 4 mixins dart

我应该得到以下错误:

class.dart:11:11:错误:没有为类“Y”定义 getter“_privateID”。-“Y”来自“class.dart”。尝试将名称更正为现有 getter 的名称,或定义名为“_privateID”的 getter 或字段。

从下面的代码?

mixin.dart

class Mixin {
  static int _nextID = 0;

  int publicID = _nextID++; // I only need one of these lines
  int _privateID = _nextID++; // but this variable is inaccessible
}
Run Code Online (Sandbox Code Playgroud)

类.dart

import 'mixin.dart';

class X with Mixin {
  void run() {
    print(publicID); // no error here
  }
}

class Y with Mixin {
  void run() {
    print(_privateID); // Error: _privateID not defined
  }
}

void main() {
  Y().run();
}
Run Code Online (Sandbox Code Playgroud)

或者这是一个错误?如果这不是一个错误,我想了解为什么这种行为是合理的。

当我在与上述类相同的文件中定义 mixin 时,我没有收到任何错误。

(Dart SDK 2.4.1。)

lrn*_*lrn 6

这不是一个错误。私有字段是继承的,但您无法访问它,因为它的名称对于其他库来说是私有的。

Dart 的“隐私”概念是库私有名称_privateID库中的名称mixin.dart引入了库私有名称。这个名字的特殊之处在于它只能在同一个库内。如果有人_privateID在不同的库中编写,则它是一个不同的名称,而是该库所独有的名称。

这就好像私有名称包含了它所写入的库的库 URI,所以您真正声明的是一个 name _privateID@mixin.dart。当您尝试读取 中的该字段时class.dart,您会编写._privateID,但因为它位于不同的库中,所以您真正编写的是._privateID@class.dart,一个完全不同的名称,并且类没有任何使用名称的声明。

因此,如果一个类需要访问另一个类(或 mixin 或其他任何东西)的私有成员,那么这两个类需要在同一个库中声明,否则它们甚至无法写入该变量的名称。

这就是为什么如果您在同一个库中编写 mixin 则代码可以工作的原因。如果您想将 mixin 移至单独的文件,但不一定是单独的库,则可以使用partfile

  • 几乎所有 Dart 文件都是单独的库。只有库可以有“导入”。例外的是 *part* 文件,它们本身不是库,而只是包含在另一个文件的库中。您可以使用“part "partfile.dart";”声明将零件包含在库中,并通过以指向其所在库的“part of "thelibrary.dart";”声明开头来将零件文件标记为一个零件文件一部分。尽管工具可能知道 Pub 包,但 Dart *语言* 目前除了库之外没有任何其他代码组织粒度。 (2认同)